z-stack 终端请求绑定方式

z-stack 终端请求绑定方式
z-stack 终端请求绑定方式

ZDO终端设备绑定请求:设备能告诉协调器他们想建立绑定表格报告。该协调器将使协调并在这两个设备上创建绑定表格条目。在这里是以SerialApp例子为例。

void SerialApp_HandleKeys( uint8 shift, uint8 keys )

{

zAddrType_t dstAddr;

if ( shift )

{

if ( keys & HAL_KEY_SW_1 )

{

}

if ( keys & HAL_KEY_SW_2 )

{

}

if ( keys & HAL_KEY_SW_3 )

{

}

if ( keys & HAL_KEY_SW_4 )

{

}

}

else

{

if ( keys & HAL_KEY_SW_1 )

{

}

if ( keys & HAL_KEY_SW_2 )

{

HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

//终端设备绑定请求

// Initiate an End Device Bind Request for the mandatory endpoint

dstAddr.addrMode = Addr16Bit;

dstAddr.addr.shortAddr = 0x0000; // Coordinator

ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),

SerialApp_epDesc.endPoint,

SERIALAPP_PROFID,

SERIALAPP_MAX_CLUSTERS,

(cId_t *)SerialApp_ClusterList,

SERIALAPP_MAX_CLUSTERS,

(cId_t *)SerialApp_ClusterList,

FALSE );

}

if ( keys & HAL_KEY_SW_3 )

{

}

if ( keys & HAL_KEY_SW_4 )

{

HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

//描述符匹配请求这也是两不同匹配方式,使用的按键不同

// Initiate a Match Description Request (Service Discovery)

dstAddr.addrMode = AddrBroadcast; //广播地址

dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;

ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,

SERIALAPP_PROFID,

SERIALAPP_MAX_CLUSTERS,

(cId_t *)SerialApp_ClusterList,

SERIALAPP_MAX_CLUSTERS,

(cId_t *)SerialApp_ClusterList,

FALSE );

}

}

}

说明:从上面可以看到,SW2是发送终端设备绑定请求方式,SW4是发送描述符匹配请求方式。如果按下SW1的话,使用终端设备绑定请求方式,这里是要通过终端告诉协调器他们想要建立绑定表格,协调器将协调这两个请求的设备,在两个设备上建立绑定表格条目。

(1)终端设备向协调器发送终端设备绑定请求

调用ZDP_EndDeviceBindReq()函数发送绑定请求。

ZDP_EndDeviceBindReq( &dstAddr, //目的地址设为0x0000;

NLME_GetShortAddr(),

SerialApp_epDesc.endPoint, //EP号

SERIALAPP_PROFID,//Profile ID

SERIALAPP_MAX_CLUSTERS, //输入簇的数目

(cId_t *)SerialApp_ClusterList, //输入簇列表

SERIALAPP_MAX_CLUSTERS, //输出簇数目

(cId_t *)SerialApp_ClusterList,//输出簇列表

FALSE );

该函数实际调用无线发送函数将绑定请求发送给协调器节点:默认clusterID为

End_Device_Bind_req,最后通过AF_DataRequest()发送出去.

fillAndSend( &ZDP_TransID, dstAddr, End_Device_Bind_req, len );

最后通过AF_DataRequest()发送出去.

AF_DataRequest( &afAddr, &ZDApp_epDesc, clusterID,

(uint16)(len+1), (uint8*)(ZDP_TmpBuf-1),

transSeq, ZDP_TxOptions, AF_DEFAULT_RADIUS );

(2) 协调器收到终端设备绑定请求End_Device_Bind_req

这个信息会传送到ZDO层,在ZDO层的事件处理函数中,调用

ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );

UINT16 ZDApp_event_loop( byte task_id, UINT16 events )

{

uint8 *msg_ptr;

if ( events & SYS_EVENT_MSG )

{

while ( (msg_ptr = osal_msg_receive( ZDAppTaskID )) )

{

ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );

// Release the memory

osal_msg_deallocate( msg_ptr );

}

// Return unprocessed events

return (events ^ SYS_EVENT_MSG);.....................

}

void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr )

{

// Data Confirmation message fields

byte sentEP; // This should always be 0

byte sentStatus;

afDataConfirm_t *afDataConfirm;

switch ( msgPtr->event )

{

// Incoming ZDO Message

case AF_INCOMING_MSG_CMD:

ZDP_IncomingData( (afIncomingMSGPacket_t *)msgPtr );

break;................................}

在ZDP_IncomingData( (afIncomingMSGPacket_t *)msgPtr );函数中

void ZDP_IncomingData( afIncomingMSGPacket_t *pData )

{

uint8 x = 0;

uint8 handled;

zdoIncomingMsg_t inMsg;

inMsg.srcAddr.addrMode = Addr16Bit;

inMsg.srcAddr.addr.shortAddr = pData->srcAddr.addr.shortAddr;

inMsg.wasBroadcast = pData->wasBroadcast;

inMsg.clusterID = pData->clusterId;

inMsg.SecurityUse = pData->SecurityUse;

inMsg.asduLen = pData->cmd.DataLength-1;

inMsg.asdu = pData->cmd.Data+1;

inMsg.TransSeq = pData->cmd.Data[0];

handled = ZDO_SendMsgCBs( &inMsg );

#if defined( MT_ZDO_FUNC )

MT_ZdoRsp( &inMsg );

#endif

while ( zdpMsgProcs[x].clusterID != 0xFFFF )

{

if ( zdpMsgProcs[x].clusterID == inMsg.clusterID )

{

zdpMsgProcs[x].pFn( &inMsg );

return;

}

x++;

}

// Handle unhandled messages

if ( !handled )

ZDApp_InMsgCB( &inMsg );

}

因为ZDO信息处理表zdpMsgProcs[ ]没有对应的End_Device_Bind_req簇,因此没有调用ZDO信息处理表中的处理函数,但是前面的ZDO_SendMsgCBs()会把这个终端设备绑定请求发

送到登记过这个ZDO信息的任务中去。那这个登记注册的程序在哪里呢?

对于协调器来说,由于在void ZDApp_Init( byte task_id )函数中调用了ZDApp_RegisterCBs();面的函数。进行注册了终端绑定请求信息。

void ZDApp_RegisterCBs( void )

{

#if defined ( ZDO_IEEEADDR_REQUEST ) || defined ( REFLECTOR )

ZDO_RegisterForZDOMsg( ZDAppTaskID, IEEE_addr_rsp );

#endif

#if defined ( ZDO_NWKADDR_REQUEST ) || defined ( REFLECTOR )

ZDO_RegisterForZDOMsg( ZDAppTaskID, NWK_addr_rsp );

#endif

#if defined ( ZDO_COORDINATOR )

ZDO_RegisterForZDOMsg( ZDAppTaskID, Bind_rsp );

ZDO_RegisterForZDOMsg( ZDAppTaskID, Unbind_rsp );

ZDO_RegisterForZDOMsg( ZDAppTaskID, End_Device_Bind_req );

#endif

#if defined ( REFLECTOR )

ZDO_RegisterForZDOMsg( ZDAppTaskID, Bind_req );

ZDO_RegisterForZDOMsg( ZDAppTaskID, Unbind_req );

#endif

}

因此,协调器节点的ZDApp 接收到外界输入的数据后,由于注册了ZDO 反馈消息,即ZDO_CB_MSG,ZDApp 层任务事件处理函数将进行处理:也就是调用下面的程序。

UINT16 ZDApp_event_loop( byte task_id, UINT16 events )

{

uint8 *msg_ptr;

if ( events & SYS_EVENT_MSG )

{

while ( (msg_ptr = osal_msg_receive( ZDAppTaskID )) )

{

ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );

// Release the memory

osal_msg_deallocate( msg_ptr );

}

// Return unprocessed events

return (events ^ SYS_EVENT_MSG);

..............................

}

在这里调用函数ZDApp_ProcessOSALMsg( (osal_event_hdr_t *)msg_ptr );在这个函数中我们可以看到对ZDO_CB_MSG事件的处理

void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr )

{

// Data Confirmation message fields

byte sentEP; // This should always be 0

byte sentStatus;

afDataConfirm_t *afDataConfirm;

switch ( msgPtr->event )

{

// Incoming ZDO Message

case AF_INCOMING_MSG_CMD:

ZDP_IncomingData( (afIncomingMSGPacket_t *)msgPtr );

break;

case ZDO_CB_MSG:

ZDApp_ProcessMsgCBs( (zdoIncomingMsg_t *)msgPtr );

break;

....................................

}

调用ZDApp_ProcessMsgCBs()函数。在这个函数中根据ClusterID(这里是

End_Device_Bind_req)选择相对应的匹配描述符处理函数,

void ZDApp_ProcessMsgCBs( zdoIncomingMsg_t *inMsg )

{

switch ( inMsg->clusterID )

{

#if defined ( ZDO_NWKADDR_REQUEST ) || defined ( ZDO_IEEEADDR_REQUEST ) || defined ( REFLECTOR )

case NWK_addr_rsp:

case IEEE_addr_rsp:

{

ZDO_NwkIEEEAddrResp_t *pAddrRsp;

pAddrRsp = ZDO_ParseAddrRsp( inMsg );

if ( pAddrRsp )

{

if ( pAddrRsp->status == ZSuccess )

{

ZDO_UpdateAddrManager( pAddrRsp->nwkAddr, pAddrRsp->extAddr );

}

osal_mem_free( pAddrRsp );

}

}

break;

#endif

#if defined ( REFLECTOR )

case Bind_req:

case Unbind_req:

{

ZDO_BindUnbindReq_t bindReq;

ZDO_ParseBindUnbindReq( inMsg, &bindReq );

ZDO_ProcessBindUnbindReq( inMsg, &bindReq );

}

break;

#endif

#if defined ( ZDO_COORDINATOR )

case Bind_rsp:

case Unbind_rsp:

if ( matchED )

{

ZDMatchSendState(

(uint8)((inMsg->clusterID == Bind_rsp) ? ZDMATCH_REASON_BIND_RSP : ZDMATCH_REASON_UNBIND_RSP),

ZDO_ParseBindRsp(inMsg), inMsg->TransSeq );

}

break;

case End_Device_Bind_req:

{

ZDEndDeviceBind_t bindReq;

ZDO_ParseEndDeviceBindReq( inMsg, &bindReq );//解析绑定请求信息

//然后向发送绑定请求的节点发送绑定响应消息:

ZDO_MatchEndDeviceBind( &bindReq );

// Freeing the cluster lists - if allocated.

if ( bindReq.numInClusters )

osal_mem_free( bindReq.inClusters );

if ( bindReq.numOutClusters )

osal_mem_free( bindReq.outClusters );

}

break;

#endif

}

}

下面是ZDO_MatchEndDeviceBind()函数的源代码

void ZDO_MatchEndDeviceBind( ZDEndDeviceBind_t *bindReq )

{

zAddrType_t dstAddr;

uint8 sendRsp = FALSE;

uint8 status;

// Is this the first request? 接收到的是第一个绑定请求

if ( matchED == NULL )

{

// Create match info structure 创建匹配信息结构体

matchED = (ZDMatchEndDeviceBind_t *)osal_mem_alloc( sizeof

( ZDMatchEndDeviceBind_t ) ); //分配空间

if ( matchED )

{

// Clear the structure 先进行清除操作

osal_memset( (uint8 *)matchED, 0, sizeof ( ZDMatchEndDeviceBind_t ) );

// Copy the first request's information 复制第一个请求信息

if ( !ZDO_CopyMatchInfo( &(matchED->ed1), bindReq ) ) //复制不成功后

{

status = ZDP_NO_ENTRY;

sendRsp = TRUE;

}

}

else //分配空间不成功

{

status = ZDP_NO_ENTRY;

sendRsp = TRUE;

}

if ( !sendRsp ) //分配空间成功,复制数据结构成功

{

// Set into the correct state 设置正确的设备状态

matchED->state = ZDMATCH_WAIT_REQ;

// Setup the timeout 设置计时时间APS_SetEndDeviceBindTimeout(AIB_MaxBindingTime, ZDO_EndDeviceBindMatchTimeoutCB );

}

}

else //接收到的不是第一个绑定请求

{

matchED->state = ZDMATCH_SENDING_BINDS; //状态为绑定中

// Copy the 2nd request's information 拷贝第2个请求信息结构

if ( !ZDO_CopyMatchInfo( &(matchED->ed2), bindReq ) ) //拷贝不成功

{

status = ZDP_NO_ENTRY;

sendRsp = TRUE;

}

// Make a source match for ed1

//对ed1的输出簇ID与ed2的输入簇ID进行比较,如果有符合的则会返回,相匹配的簇的数目

matchED->ed1numMatched = ZDO_CompareClusterLists(

matchED->ed1.numOutClusters, matchED->ed1.outClusters,

matchED->ed2.numInClusters, matchED->ed2.inClusters, ZDOBuildBuf );

if ( matchED->ed1numMatched ) //如果有返回ed1相匹配的簇

{

// Save the match list 申请空间保存相匹配的簇列表

matchED->ed1Matched= osal_mem_alloc( (short)(matchED->ed1numMatched * sizeof

( uint16 )) );

if ( matchED->ed1Matched ) //分配成功

{

//保存相匹配的簇列表

osal_memcpy(matchED->ed1Matched,ZDOBuildBuf, (matchED->ed1numMatched * sizeof ( uint16 )) );

}

else //内存空间分配不成功

{

// Allocation error, stop

status = ZDP_NO_ENTRY;

sendRsp = TRUE;

}

}

// Make a source match for ed2 以ed2为源

//对ed2的终端匹配请求和ed1的簇列表相比较,返回相相匹配的簇的数目

matchED->ed2numMatched = ZDO_CompareClusterLists(

matchED->ed2.numOutClusters, matchED->ed2.outClusters,

matchED->ed1.numInClusters, matchED->ed1.inClusters, ZDOBuildBuf );

if ( matchED->ed2numMatched )//如果匹配成功

{

// Save the match list 保存匹配的簇列表

matchED->ed2Matched = osal_mem_alloc( (short)(matchED->ed2numMatched * sizeof

( uint16 )) );

if ( matchED->ed2Matched )

{

osal_memcpy( matchED->ed2Matched, ZDOBuildBuf, (matchED->ed2numMatched * sizeof ( uint16 )) );

}

else

{

// Allocation error, stop

status = ZDP_NO_ENTRY;

sendRsp = TRUE;

}

}

//如果两个相请求的终端设备,有相匹配的簇,并且保存成功

if ( (sendRsp == FALSE) && (matchED->ed1numMatched || matchED->ed2numMatched) )

{

// Do the first unbind/bind state 发送响应信息给两个设备

ZDMatchSendState( ZDMATCH_REASON_START, ZDP_SUCCESS, 0 );

}

else

{

status = ZDP_NO_MATCH;

sendRsp = TRUE;

}

}

if ( sendRsp ) //如果没有相匹配的或匹配不成功

{

// send response to this requester 发送匹配请求响应

dstAddr.addrMode = Addr16Bit; //设置目的地址是16位的短地址

dstAddr.addr.shortAddr = bindReq->srcAddr;

//发送绑定终端响应函数status = ZDP_NO_MATCH;

ZDP_EndDeviceBindRsp( bindReq->TransSeq, &dstAddr, status, bindReq->SecurityUse );

if ( matchED->state == ZDMATCH_SENDING_BINDS )

{

// send response to first requester

dstAddr.addrMode = Addr16Bit;

dstAddr.addr.shortAddr = matchED->ed1.srcAddr;

ZDP_EndDeviceBindRsp( matchED->ed1.TransSeq, &dstAddr, status,

matchED->ed1.SecurityUse );

}

// Process ended - release memory used

ZDO_RemoveMatchMemory();

}

}

ZDO_MatchEndDeviceBind()函数,如果协调器接收到接收到第一个绑定请求,则分配内存空间进行保存并计时,如果不是第一个绑定请求,则分别以第一个和第二个绑定请求为源绑定,进行比较匹配,如果比较匹配成功则发送匹配成功的信息End_Device_Bind_rsp给两个请求终端。因为在ZDMatchSendState()函数中也是调用了ZDP_EndDeviceBindRsp()函数,对匹配请求响应进行了发送。如果匹配不成功则发送匹配失败的信息给两个终端。

uint8 ZDMatchSendState( uint8 reason, uint8 status, uint8 TransSeq )

{

..............................

else

{

// Send the response messages to requesting devices

// send response to first requester 发送响应信息给第一个请求终端,

dstAddr.addr.shortAddr = matchED->ed1.srcAddr;

ZDP_EndDeviceBindRsp( matchED->ed1.TransSeq, &dstAddr, rspStatus,

matchED->ed1.SecurityUse );

// send response to second requester 发送响应信息给第二请求终端

if ( matchED->state == ZDMATCH_SENDING_BINDS )

{

dstAddr.addr.shortAddr = matchED->ed2.srcAddr;

ZDP_EndDeviceBindRsp( matchED->ed2.TransSeq, &dstAddr, rspStatus,

matchED->ed2.SecurityUse );

}

// Process ended - release memory used

ZDO_RemoveMatchMemory();

}

return ( TRUE );

}

(3)终端结点的响应

由于终端节点在SerialApp.c 中层注册过End_Device_Bind_rsp 消息,因此当接收到协调器节点发来的绑定响应消息将交由SerialApp 任务事件处理函数处理:

UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )

{

if ( events & SYS_EVENT_MSG )

{

afIncomingMSGPacket_t *MSGpkt;

while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive(

SerialApp_TaskID )) )

{

switch ( MSGpkt->hdr.event )

{

case ZDO_CB_MSG:

SerialApp_ProcessZDOMsgs( (zdoIncomingMsg_t *)MSGpkt );

break;

...................................

}

然后,调用SerialApp_ProcessZDOMsgs()函数。进行事件处理。

static void SerialApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )

{

switch ( inMsg->clusterID )

{

case End_Device_Bind_rsp:

if ( ZDO_ParseBindRsp( inMsg ) == ZSuccess )

{

// Light LED

HalLedSet( HAL_LED_4, HAL_LED_MODE_ON );

}

#if defined(BLINK_LEDS)

else

{

// Flash LED to show failure

HalLedSet ( HAL_LED_4, HAL_LED_MODE_FLASH );

}

#endif

break;

................................

}

至此,整个的终端绑定就完成了,从中我们也可以看到其和描述符匹配请求的绑定方式有很大的不同,在描述符匹配请求中,我们知道其实两个设备之间的绑定是不需要经过协调器的,而这种绑定是必须要和协调器发生联系后,才能在两个终端设备中,建立绑定关系。也就是下面的这种方式。

“终端设备绑定请求”这一命名有误导的嫌疑。这一请求不仅仅适用于终端设备,而且适用于对希望在协调器上绑定的两个设备中匹配的簇实施绑定。一旦这个函数被调用,将假设REFLECTOR这一编译选项在所有希望使用这一服务的节点中都已经打开。具体操作如下:

(1) (Bind Req) Device 1 --> Coordinator <--- Device 2 (Bind Req)

协调器首先找出包含在绑定请求中的簇,然后对比每一设备的IEEE地址,如果簇可以匹

配,而且这几个设备没有已经存在的绑定表,那他将发送一个绑定应答给每一个设备。

(2) Device 1 <--- NWK Addr Req ------ Coordinator ------- NWK addr Req ----> Device 2

(3) Device 1 ----> NWK Addr Rsp ---> Coordinator <---- NWK addr Rsp <--- Device 2

(4) Device 1 <----- Bind Rsp <----- Coordinator -----> Bind Rsp ----> Device 2

在《Z-Stack编程指南--绑定》一章中有下面的一段对终端绑定请求的描述。

该绑定机制在一个选定的设备上使用一个按键动作或类似动作在一个定制的超时周期内进行的绑定

行为。在定制的超时周期内在协调器上收集该终端设备绑定请求信息,基于配置文件标识符与簇标识

符的一致性将产生一个绑定表条目。

在用户指南[SRC 与SLC]中的应用范例是一些终端设备绑定执行的例子。(按每个设备上SW2 开关)。你将注意到所有的应用范例都有一个处理按键事件的函数(如,在TransmitApp.c 中的TransmitApp_HandleKeys( ) )。这个函数调用ZDApp_SendEndDeviceBindReq( )[在ZDApp.c 文件中],它可以收集所有应用端点的信息,并且调用ZDP_EndDeviceBindReq( ) [在ZDProfile.c 文件中]来发送

信息到协调器中。

协调器将接收[ZDP_IncomingData( ),在ZDProfile.c 中]和分析[ZDO_ProcessEndDeviceBindReq( ),在

ZDObject.c 中]这个信息,并且调用ZDApp_EndDeviceBindReqCB( )[在ZDApp.c 中]来调用

ZDO_DoEndDeviceBind( )[在ZDObject.c]来处理该请求。

当协调器接收到两个匹配终端设备绑定请求时,将通过调用nwk_AddBindEntry( )函数来创建一个绑定记录。如果已存在这两个匹配终端设备请求的绑定记录,则协调器将调用nwk_RemoveBindingEntry( )

从绑定表中移除该条目。然后,一条响应信息将发送到这两个“终端设备” 。

GCC常见错误解析

GCC常见错误解析 一、错误类型 第一类∶C语法错误 错误信息∶文件source.c中第n行有语法错误(syntex errror)。 这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。 有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,此时要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。 第二类∶头文件错误 错误信息∶找不到头文件head.h(Can not find include file head.h)。 这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。 第三类∶档案库错误 错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or directory. 这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。第四类∶未定义符号 错误信息∶有未定义的符号(Undefined symbol)。 这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc 连接选项中的-l和-L项。 排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。这个过程中的错误,只是我们在使用C语言描述一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。 二、常见错误信息解析与处理 1

铺货管理的九个步骤

铺货管理的九个步骤 铺货管理的九个步骤 以上种种误区,经常会造成铺市工作的失败,产生许多负面的影响,比如,打击营销人员、批发商、经销商的积极性;打破企业的整体销售计划、增加企业后续工作的难度;损伤经销商的感情、浪费企业和经销商的人、财、物等。那么企业如何才能做好铺货管理工作呢? 第一步铺货信息的扫描 1. 了解目标区域市场情况 在铺货的准备阶段,企业首先应该了解目标区域市场的相关情况,诸如整个市场的特征、产品销售整体状况、消费者的消费趋势、消费习惯等,当然,销售终端的经营特点和性质是最 为关键的一环。一般来说,主要内容如下表: 终端调查内容

企业了解终端市场,切忌大刀阔斧,不仔细认真,图虚荣、高成本、吝啬“体力”;在了解终端情况的过程中,调查人员应该尽量采用画图、填表、归档的方式,靠脑筋记忆不可靠。 了解终端的方法主要有: ·“扫街”式的走访、观察,所谓百闻不如一见。 ·同行(竞品)跟随,因为一般情况下,竞争对手有他自己的想法。 ·与当地业内人士(批发商、商场人员)的访谈,很多时候,经验之谈会减少你的许多失误和 减少不必要的浪费。 ·消费者的调研,以便弄清楚消费者到底喜欢或习惯在哪里购买。 ·资料的收集与查阅,比如调研公司、统计部门或新闻媒体的一些调研报告或文章。 ·自己企业原有的一些调研和资料,也包括一些经验的类推。 可口可乐在进入新市场前,必定要求对选定的区域内的所有饮料销售终端(注意是“所有”)进行全面调查,搜集详细资料以便进行终端铺货时用,或在将来能为客户提供更优良的服务。 而搜集小店数据是最为琐碎、长久的一项销售行为。 为了有效地开展工作,培训基本扫街程序,拜访技巧和沟通训练是第一步,接下来最关键的就是:如何保证散落在各处的小店资料不遗漏,以及能保证调查的顺利实施。要知道扫街中每天的行为都是:早会、行走、标图、记录和晚会,日复一日,周而复始,单调而又复杂,需要极高的工作热情;而且工作过程中还要求你认真、仔细、真实、不遗漏、不重复,按时完成当天调查任务(每人每天调查35家售点或更多)。 关于早会工作说明、终端调查路线行下次规则、调查表格填写注意事项和晚会工作内容都有 明确的规定(见下表) 早会工作说明

终端铺货的方式方法

终端铺货的方式方法 终端铺货的方式方法 现在正处在终端压仓的活动中,从这一段时间的观察中,我发现在终端辅压货也非常的需要策略和技巧。现在就针对我在市场中的一点小的观察来帮助大家提点小策略。在营销实战中,可以采取些策略来有效减小铺货阻力。 第一:铺货奖励 在铺货时,我发现所有的终端客户都在看哪个厂家的奖品多,就会考虑进奖品多的厂家的货。因此,终端的铺货政策能够迅速拉近产品和终端的距离。在产品同质化的情况下,很多终端进货看重的并不是企业的产品,而是铺货附带的优惠政策。针对此点,在产品压仓阶段,企业协同经销商主动出击,并根据情况给予终端一定的铺货奖励,从而拉动终端店进货。如果按奖励方式来进行分类,铺货奖励有很多种,比如定额奖励、进货奖励、开户奖励、促销品支持、免费产品等。都是首先想进店进行压仓的首要条件。 第二:先易后难 在铺货过程中如果阻力太大,要善于结合铺货过程进行分析研究,通过第一次的铺货试点,要在当天结束后让厂家与经销商的所有人员都在一起总结,如:哪些类型终端容易铺,哪些市场区域容易铺,可以采取先易后难的铺货策略,在铺货渠道上避开竞争。但是一定要注意那些会被大家所忽视的终端或者是继续挖掘新的终端网点,开辟新的销售渠道。快消品一般都是多类型的终端,比如白酒有餐饮类、名烟名酒店、超市和便利店类终端售点,要结合渠道竞争情况,在前期走量大的终端比如白酒的餐饮终端较难铺的时候,可以先考虑从便利店等小型终端售点进入。在城市的中心区域铺货阻力大的时候,可以考虑从城区周遍开始铺货,走农村包围城市之路。这样做是能够鼓舞士气,使大家坚定信心,去应对更难的铺市区域。 第三:以点带面 企业可以集中资源,选择重点终端和某区域进行突破,通过示范效应进行以点带面的铺货。比如:先启动对我们有大需求的终端,来树立标杆,凭借它们的影响力向周边终端渗透铺货。也可以先启动小区域的部分零售终端,树立其它终端对产品旺销的信心,达到以点的启动来拉动面的铺货目的。特别是一些乡镇,因为只要我公司的产品进入一部分店后,其它的一些店家都会相应的进些货。因为他们也有顾虑,也怕别的店抢生意。 第四:捆绑带动 针对新品入市时,为了减少新产品上市的铺货阻力,也可以采取捆绑带动的策略,通过畅销产品来带动新产品的铺货。把新产品和畅销产品捆绑在一起销售,利用原有畅销产品的终端来“带货销售”,这样就可以降低新产品的铺货阻力,使新产品快速抵达零售终端,

Zigbee协议栈原理基础

1Zigbee协议栈相关概念 1.1近距离通信技术比较: 近距离无线通信技术有wifi、蓝牙、红外、zigbee,在无线传感网络中需求的网络通信恰是近距离需求的,故,四者均可用做无线传感网络的通信技术。而,其中(1)红外(infrared):能够包含的信息过少;频率低波衍射性不好只能视距通信;要求位置固定;点对点传输无法组网。(2)蓝牙(bluetooth):可移动,手机支持;通信距离10m;芯片价格贵;高功耗(3)wifi:高带宽;覆盖半径100m;高功耗;不能自组网;(4)zigbee:价格便宜;低功耗;自组网规模大。?????WSN中zigbee通信技术是最佳方案,但它连接公网需要有专门的网关转换→进一步学习stm32。 1.2协议栈 协议栈是网络中各层协议的总和,其形象的反映了一个网络中文件传输的过程:由上层协议到底层协议,再由底层协议到上层协议。 1.2.1Zigbee协议规范与zigbee协议栈 Zigbee各层协议中物理层(phy)、介质控制层(mac)规范由IEEE802.15.4规定,网络层(NWK)、应用层(apl)规范由zigbee联盟推出。Zigbee联盟推出的整套zigbee规范:2005年第一版ZigBeeSpecificationV1.0,zigbee2006,zigbee2007、zigbeepro zigbee协议栈:很多公司都有自主研发的协议栈,如TI公司的:RemoTI,Z-Stack,SimpliciTI、freakz、msstatePAN 等。 1.2.2z-stack协议栈与zigbee协议栈 z-stack协议栈与zigbee协议栈的关系:z-stack是zigbee协议栈的一种具体实现,或者说是TI公司读懂了zigbee 协议栈,自己用C语言编写了一个软件—---z-stack,是由全球几千名工程师共同开发的。ZStack-CC2530-2.3.1-1.4.0软件可与TI的SmartRF05平台协同工作,该平台包括MSP430超低功耗微控制器(MCU)、CC2520RF收发器以及CC2591距离扩展器,通信连接距离可达数公里。 Z-Stack中的很多关键的代码是以库文件的形式给出来,也就是我们只能用它们,而看不到它们的具体的实现。其中核心部分的代码都是编译好的,以库文件的形式给出的,比如安全模块,路由模块,和Mesh自组网模块。与z-stack 相比msstatePAN、freakz协议栈都是全部真正的开源的,它们的所有源代码我们都可以看到。但是由于它们没有大的商业公司的支持,开发升级方面,性能方面和z-stack相比差距很大,并没有实现商业应用,只是作为学术研究而已。 还可以配备TI的一个标准兼容或专有的网络协议栈(RemoTI,Z-Stack,或SimpliciTI)来简化开发,当网络节点要求不多在30个以内,通信距离500m-1000m时用simpliciti。 1.2.3IEEE802.15.4标准概述 IEEE802.15.4是一个低速率无线个人局域网(LowRateWirelessPersonalAreaNetworks,LR-WPAN)标准。定义了物理层(PHY)和介质访问控制层(MAC)。 LR-WPAN网络具有如下特点: ◆实现250kb/s,40kb/s,20kb/s三种传输速率。 ◆支持星型或者点对点两种网络拓扑结构。 ◆具有16位短地址或者64位扩展地址。 ◆支持冲突避免载波多路侦听技术(carriersensemultipleaccesswithcollisionavoidance,CSMA/CA)。(mac层) ◆用于可靠传输的全应答协议。(RTS-CTS) ◆低功耗。 ◆能量检测(EnergyDetection,ED)。 ◆链路质量指示(LinkQualityIndication,LQI)。 ◆在2.45GHz频带内定义了16个通道;在915MHz频带内定义了10个通道;在868MHz频带内定义了1个通道。 为了使供应商能够提供最低可能功耗的设备,IEEE(InstituteofElectricalandElectronicsEngineers,电气及电子工程师学会)定义了两种不同类型的设备:一种是完整功能设备(full.functionaldevice,FFD),另一种是简化功能设备

KEIL常见编译错误大全

KEIL常见编译错误大全 【致命错误】 立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不 能访问一个特定的源包含文件时也产生致命错误 致命错误信息采用下面的格式 C51FATAL-ERROR– ACTION: LINE: ERROR: C51TERMIANTED. C51FATAL-ERROR– ACTION: FILE: ERROR: C51TERMIANTED. 下面说明Action和Error中可能的内容 Actions ALLOCATING MEMORY 编译器不能分配足够的存储区来编译指定的源文件. CREATING LIST-FILE/OBJECT-FILE/WORKFILE 编译器不能建立列表文件,OBJ文件,或工作文件这个错误的出现可能是磁盘满或写保护,或文件已存在和只读. GENERATING INTERMEDIATE CODE 源文件包含的一个函数太大,不能被编译器编译成虚拟代码.尝试把函数分小或重新编译. OPENING INPUT-FILE 编译器不能发现或打开所选的源或包含文件. PARSING INVOKE-/#PRAGMA-LINE 当在命令行检测到参数计算,或在一个#pragma中检测到参数计算,就产生这样的错误. PARSING SOURCE-FILE/ANALYZING DECLARATIONS 源文件包含太多的外部参考.减少源文件访问的外部变量和函数的数目. WRITING TO FILE

铺货的十种策略讲解学习

铺货的十种策略

铺货的十种策略,具体实施中要结合企业的资源和条件灵活采用,可以多种策略组合实施。铺货策略只是实施成功铺货的因素之一,要提高铺货的成功率,实现有效铺货,还需注意以下问题: 宝洁公司曾说过:你是世界上最好的产品,有最好的广告支持,如果消费者不能在售点买到它们,就无法完成销售!只有消费者在终端售点见到产品,才有消费购买的可能。为什么凭借高空广告狂轰烂炸的健力宝第五季在市场上昙花一现?终端铺货不到位是其败走麦城的根本原因! 终端铺货的重要性不言而喻,但铺货并不是企业或经销商想铺就能把货顺利铺下去的,铺货的产品、铺货人员的能力、终端阻力等种种因素决定着铺货的结果,但最关键的还是要有正确的铺货策略,思路决定出路,策略对路,铺货工作就成功了一半。那么,在营销实战中,可以采取哪些策略来有效减小铺货阻力呢? 第一:铺货奖励 中国人讲究“礼尚往来”,针对终端的铺货政策能够迅速拉近产品和终端的距离。在产品同质化的情况下,很多终端进货看重的并不是企业的产品和品牌,而是铺货附带的优惠政策。在产品上市阶段,企业协同经销商主动出击,并根据情况给予终端一定的铺货奖励,从而拉动终端店进货。如果按奖励方式来进行分类,铺货奖励有很多种,比如定额奖励、坎级奖励、进货奖励、开户奖励、促销品支持、免费产品等。 第二:先易后难

在铺货过程中如果阻力太大,要善于结合铺货过程进行分析研究,通过初次的铺货试点要总结,哪些类型终端容易铺,哪些市场区域容易铺,可以采取先易后难的铺货策略,在铺货渠道上避开竞争,注意被大家所忽视的终端或者是挖掘新的终端网点,开辟新的销售渠道。 快消品一般都是多类型的终端,比如白酒有餐饮类、名烟名酒店、超市和便利店类终端售点,要结合渠道竞争情况,在前期走量大的终端比如白酒的餐饮终端较难铺的时候,可以先考虑从便利店等小型终端售点进入。在城市的中心区域铺货阻力大的时候,可以考虑从城区周遍开始铺货,走农村保卫城市之路。第三:适当铺底 对于中小企业来说,在无法大规模投入广告来拉动终端销售的情况下,要想现款铺货是很难的,如果硬要求现款铺货,反而会导致销售成本更高。在这种情况下,可以通过采取适量铺底的方式来减小铺货阻力,达到较高的铺货率。也就是说,企业或经销商提供给终端的的铺底货款暂不收回,待其卖完后第二次进货时,才要求现金交易。但铺底数量必须严格限制,同时配合必要的推广活动,使零售终端尽快产生销售,快速进入良性循环。 第四:以点带面 企业可以集中资源,选择重点终端和某区域进行突破,通过示范效应进行以点带面的铺货。可以先启动终端大中型超市或卖场,树立标杆,凭借超市的影响力向周边小型终端渗透铺货。也可以先启动小区域的部分零售终端,树立其它终端对产品旺销的信心,达到以点的启动来拉动面的铺货目的。

2020年Zigbee协议栈中文说明免费

1.概述 1.1解析ZigBee堆栈架构 ZigBee堆栈是在IEEE 802.15.4标准基础上建立的,定义了协议的MAC和PHY层。ZigBee设备应该包括IEEE802.15.4(该标准定义了RF射频以及与相邻设备之间的通信)的PHY和MAC层,以及ZigBee堆栈层:网络层(NWK)、应用层和安全服务提供层。图1-1给出了这些组件的概况。 1.1.1ZigBee堆栈层 每个ZigBee设备都与一个特定模板有关,可能是公共模板或私有模板。这些模板定义了设备的应用环境、设备类型以及用于设备间通信的簇。公共模板可以确保不同供应商的设备在相同应用领域中的互操作性。 设备是由模板定义的,并以应用对象(Application Objects)的形式实现(见图1-1)。每个应用对象通过一个端点连接到ZigBee堆栈的余下部分,它们都是器件中可寻址的组件。 图1-1 zigbe堆栈框架 从应用角度看,通信的本质就是端点到端点的连接(例如,一个带开关组件的设备与带一个或多个灯组件的远端设备进行通信,目的是将这些灯点亮)。 端点之间的通信是通过称之为簇的数据结构实现的。这些簇是应用对象之间共享信息所需的全部属性的容器,在特殊应用中使用的簇在模板中有定义。图1-1-2就是设备及其接口的一个例子:

图1-1-2 每个接口都能接收(用于输入)或发送(用于输出)簇格式的数据。一共有二个特殊的端点,即端点0和端点255。端点0用于整个ZigBee设备的配置和管理。应用程序可以通过端点0与ZigBee 堆栈的其它层通信,从而实现对这些层的初始化和配置。附属在端点0的对象被称为ZigBee设备对象 (ZD0)。端点255用于向所有端点的广播。端点241到254是保留端点。 所有端点都使用应用支持子层(APS)提供的服务。APS通过网络层和安全服务提供层与端点相接,并为数据传送、安全和绑定提供服务,因此能够适配不同但兼容的设备,比如带灯的开关。APS使用网络层(NWK)提供的服务。NWK负责设备到设备的通信,并负责网络中设备初始化所包含的活动、消息路由和网络发现。应用层可以通过ZigBee设备对象(ZD0)对网络层参数进行配置和访问。 1.1.2 80 2.15.4 MAC层 IEEE 802.15.4标准为低速率无线个人域网(LR-WPAN)定义了OSI模型开始的两层。PHY层定义了无线射频应该具备的特征,它支持二种不同的射频信号,分别位于2450MHz波段和868/915MHz 波段。2450MHz波段射频可以提供250kbps的数据速率和16个不同的信道。868 /915MHz波段中,868MHz支持1个数据速率为20kbps的信道,915MHz支持10个数据速率为40kbps的信道。MAC层负责相邻设备间的单跳数据通信。它负责建立与网络的同步,支持关联和去关联以及MAC 层安全:它能提供二个设备之间的可靠链接。 1.1.3 关于服务接入点 ZigBee堆栈的不同层与802.15.4 MAC通过服务接入点(SAP)进行通信。SAP是某一特定层提供的服务与上层之间的接口。 ZigBee堆栈的大多数层有两个接口:数据实体接口和管理实体接口。数据实体接口的目标是向上层提供所需的常规数据服务。管理实体接口的目标是向上层提供访问内部层参数、配置和管理数据的机制。 1.1.4 ZigBee的安全性 安全机制由安全服务提供层提供。然而值得注意的是,系统的整体安全性是在模板级定义的,这意味着模板应该定义某一特定网络中应该实现何种类型的安全。 每一层(MAC、网络或应用层)都能被保护,为了降低存储要求,它们可以分享安全钥匙。SSP是通过ZD0进行初始化和配置的,要求实现高级加密标准(AES)。ZigBee规范定义了信任中心的用

CCS编译错误和警告信息

C28x编译器错误和警告消息 From Texas Instruments Wiki从德州仪器维基 Jump to:跳转到:navigation导航,search搜索 Translate this page to TranslateShow original C28x Compiler Error and Warning MessagesC28x编译器错误和警告消息Contents内容 [hide] ?11Introduction介绍 ?22Possible Errors,Warnings and Remarks可能的错误、警告和言论?33Common Errors and Warnings常见的错误和警告 o 3.13.1Warning:build attribute vendor section TI missing in ":compatibility cannot be determined 警告:构建属性供应商部分TI失踪”<图书馆或对象>:兼容性不能 确定 o 3.23.2fatal error:file.....rts2800_fpu32.lib"specifies ISA revision"C28FPU32",which is not compatible with ISA revision"C2800"specified in a previous file or on the command lineobj>“指定ISA修订“C28FPU32”,这不是兼容ISA 修订“C2800”之前的文件中指定或在命令行上 o 3.33.3Warning:entry-point symbol other than"_c_int00" specified:"code_start"警告:入口点符号除了“_c_int00”规 定:“code_start” o 3.43.4Error:unresolved symbols remain....错误:未解决符号保持.... o 3.53.5Error:Tag_ISA attribute value of"2"that is different than one previously seen("1");combining incompatible files错误:Tag_ISA属性值的“2”是不同于一个以 前见过(“1”);结合不兼容的文件 o 3.63.6Error:Tag_Memory_Model attribute value of"1"that is different than one previously seen("2");combining incompatible files错误:Tag_Memory_Model属性值“1”,是不同

铺货管理的九个步骤讲解

铺货管理的九个步骤 以上种种误区,经常会造成铺市工作的失败,产生许多负面的影响,比如,打击营销人员、批发商、经销商的积极性;打破企业的整体销售计划、增加企业后续工作的难度;损伤经销商的感情、浪费企业和经销商的人、财、物等。那么企业如何才能做好铺货管理工作呢? 第一步铺货信息的扫描 1.了解目标区域市场情况 在铺货的准备阶段,企业首先应该了解目标区域市场的相关情况,诸如整个市场的特征、产品销售整体状况、消费者的消费趋势、消费习惯等,当然,销售终端的经营特点和性质是最为关键的一环。一般来说,主要内容如下表: 企业了解终端市场,切忌大刀阔斧,不仔细认真,图虚荣、高成本、吝啬“体力”;在了解终端情况的过程中,调查人员应该尽量采用画图、填表、归档的方式,靠脑筋记忆不可靠。了解终端的方法主要有:

·“扫街”式的走访、观察,所谓百闻不如一见。 ·同行(竞品)跟随,因为一般情况下,竞争对手有他自己的想法。 ·与当地业内人士(批发商、商场人员)的访谈,很多时候,经验之谈会减少你的许多失误和减少不必要的浪费。 ·消费者的调研,以便弄清楚消费者到底喜欢或习惯在哪里购买。 ·资料的收集与查阅,比如调研公司、统计部门或新闻媒体的一些调研报告或文章。 ·自己企业原有的一些调研和资料,也包括一些经验的类推。 可口可乐在进入新市场前,必定要求对选定的区域内的所有饮料销售终端(注意是“所有”)进行全面调查,搜集详细资料以便进行终端铺货时用,或在将来能为客户提供更优良的服务。而搜集小店数据是最为琐碎、长久的一项销售行为。 为了有效地开展工作,培训基本扫街程序,拜访技巧和沟通训练是第一步,接下来最关键的就是:如何保证散落在各处的小店资料不遗漏,以及能保证调查的顺利实施。要知道扫街中每天的行为都是:早会、行走、标图、记录和晚会,日复一日,周而复始,单调而又复杂,需要极高的工作热情;而且工作过程中还要求你认真、仔细、真实、不遗漏、不重复,按时完成当天调查任务(每人每天调查35家售点或更多)。 关于早会工作说明、终端调查路线行下次规则、调查表格填写注意事项和晚会工作内容都有明确的规定(见下表) 早会工作说明

快速铺货方案

快速铺货方案设计 2007-09-22 18:00:40| 分类:市场营销 | 标签:|举报|字号大中小订阅 用铺货迅速启动市场 日用品、药品、食品、饮料等快速消费品行业,盛行着一种很独特的营销策略——铺货。 所谓“铺货”,就是厂商配合经销商进行的一种市场作业,这种作业的方式是由厂商的业务员驾驶本厂货车(或经销商派车)载满产品,与经销商一起,按预定的拜访路线,拜访与该经销商有交易往来的“终端”(注:本文所提到的“终端”是指:街头的快修店、小型汽修厂、汽配店、养护中心、4M店等等),凭借经销商与零售店长期的合作关系,由业务员向零售店详加解说,使零售店同意进货。总而言之,铺货就是将厂商的产品“铺进”零售店。润滑油作为特殊的快速消费品,完全可以借鉴其操作模式。 一、可实施铺货的行业 铺货是一种很有效的营销策略,除了日用品、药品、食品业,其它行业只要具备下列两个条件均可应用铺货策略: 1、该行业的产品能迅速实现销售,一般重复消费期不超过一个月。 2、该行业主要通过终端销售,厂商不可能跟所有的客户或消费者直接交易。 二、适宜铺货的产品 1、新产品(市场上还没有的产品、厂商新推出市面上已有其他厂商的产品)。 2、夕阳产品。 3、厂商的第一种产品已在市场上站稳,新推出的第二种产品。 4、老产品的新规格、新款式。 三、铺货对厂商的益处 1、铺货就是将厂商的产品由上游的经销商迅速流向下游的零售店,使产品的流通和销售速度得以加快,充分发挥“推式战略”的功能。 2、对新产品而言,铺货就是抢滩登陆。一旦铺进零售店,该店便可能成为此产品的永久阵地,将陆续向经销商进货。 3、铺货能迅速地将新产品铺进市场的每一角落,以便广告活动展开后,消费者能方便地买到该产品。 4、铺货能创造新产品的行情价。 5、因实施铺货,得以使产品陈列在零售店,让消费者看见,有助于提高产品的知名度。亦即铺货具有“广告”的功效,且成本较低。 6、铺货可掌握经销商,使之经营厂商的产品。 7、铺货即“挤货”,使零售店有限的资金用在购买本公司的产品,同时也会降低对竞争厂商产品的进货。 8、铺货就是将厂商的产品以“统一价格”卖给“限定区域”的零售店,而且在进行铺货作业时,均有厂商的业务员从旁“监督”。因此,铺货不会造成市场价格混乱和越区的现象。 四、铺货的难点 1、经销商认为没有足够的人手和时间配合厂商实施铺货。 2、经销商传统的经营模式多半是坐在店里等候零售商上门的“被动经营”,实施铺货等于将这种经营模式改为“主动拜访销售”。经销商不易接受这一新的观念,认为这样有损于其自尊和优越感。 3、经销商担心实施铺货后,厂商会掌握其客源,直接与零售店交易。 4、实施铺货时,有一部分零售店会拒绝进货,主要原因: ①零售店认为在铺货时进货会积压资金,不如在需要时再向经销商进货。 ②因厂商原因,造成销售渠道的价格出现矛盾,导致部分零售店有机会买进“廉价货”,这样零售店会拒绝

编译原理练习题参考答案

一、填空题: 1-01.编译程序的工作过程一般可以划分为词法分析,语法分析,语义分析,之间代码生成,代码优化等几个基本阶段,同时还会伴有表格处理和出错处理 . 1-02.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序 ,则其翻译程序称为编译程序. 1-03.编译方式与解释方式的根本区别在于是否生成目标代码 . 1-04.翻译程序是这样一种程序,它能够将用甲语言书写的程序转换成与其等价的用乙语言书写的程 序 . 1-05.对编译程序而言,输入数据是源程序 ,输出结果是目标程序 . 1-06.如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两大阶段: 编译阶段和运行阶段 .如果编译程序生成的目标程序是汇编语言程序,则源程序的执行分为三个阶段: 编译阶段 , 汇编阶段和运行阶段 . 1-07.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。 1-08.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。其中,词法分析器用于识别单词。 1-09.编译方式与解释方式的根本区别为是否生成目标代码。 2-01.所谓最右推导是指:任何一步α β都是对α中最右非终结符进行替换的。 2-02.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。 2-03.产生式是用于定义语法成分的一种书写规则。 2-04.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x│S x,x∈V T*} 。 2-05.设G是一个给定的文法,S是文法的开始符号,如果S x (其中x∈V*),则称x是文法的一个句型。 2-06.设G是一个给定的文法,S是文法的开始符号,如果S x(其中x∈V T*),则称x是文法的一个句子。 3-01.扫描器的任务是从源程序中识别出一个个单词符号。 4-01.语法分析最常用的两类方法是自上而下和自下而上分析法。 4-02.语法分析的任务是识别给定的终极符串是否为给定文法的句子。 4-03.递归下降法不允许任一非终极符是直接左递归的。 4-04.自顶向下的语法分析方法的关键是如何选择候选式的问题。 4-05.递归下降分析法是自顶向上分析方法。 4-06.自顶向下的语法分析方法的基本思想是:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。 5-01.自底向上的语法分析方法的基本思想是:从给定的终极符串开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。 5-02.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地向上进行直接归约,力求归约到文法的开始符号。

铺货的八种方法

1、铺货奖励策略 目的:拉动二批商和零售商进货 方式:定额奖励、坎级奖励、开户奖励、铺货风险金、促销品支持、免费产品和现金补贴。举例:康师傅茶饮料上市奖励 一是针对经销商实施坎级促销:1999.05.20—06.30,每300箱、500箱和1000箱分别奖励0.7元、1元和1.5元/箱。 二是对零店的“返箱皮折现金”活动,每个箱皮返2元。时间同上。 三是对零店的“财神专案”活动。规定奖励条件,达到的每陈列2瓶即送清凉饮品1瓶。2、避实就虚策略 目的:另辟蹊径,提高铺货速度 方式:避开渠道竞争,走新的终端网点。如可采的药房策略和金霸王的电话亭。 避开常规铺货时间,选择淡季铺货。如今世缘在南京,劲酒在重庆。 3、示范效应策略 目的:重点突破,以点带线,以线带面。 方式:启动核心终端,发挥示范效应 案例:某乳品在武汉铺货时采用主要超市不铺货,在广场先搞活动,差价返超市,带动超市铺货进展。 某化妆品在铺货中按照10:1原则选择社区零售店,提供适量铺底,全品项陈列,包装店面,制作招牌和广告灯箱及铜牌,建立样板点。 4、搭便车策略 目的:减少阻力,加快进度 方式:利用畅销产品,捆绑销售铺货 案例:伊川杜康用漓泉啤酒的经销商,采取捆绑铺货,降低难度。凡买一件杜康酒,送一件漓泉啤酒。 5、启动消费者策略 目的:绕开中间环节,激发购买热情 方式:找出直接顾客,直效传播影响 案例:千仟玉手足柔嫩剂进北京市场采用先使用后付款策略,让目标女士试用,激发购买欲,引起了商超注意,顺利进入各大商超。 6、制造畅销假象策略 目的:加深终端印象,减小铺货阻力 方式:集中询问,集中回购。 案例:水井坊铺货后立即全部买回,造成断货假象;某啤酒饭店点酒。 7、适量铺底策略 目的:提高铺货率,降低直接费用 方式:给商家和经销商铺底,刺激进货 8、赠送铺货策略 目的:快速启动 方式:免费赠货,快速推进 案例:太子奶长沙每个零店赠送一件奶

终端铺市的九个步骤

一、目标客户调查 1、先划分区域,按照地理位置把整个市场划分为若干个片区。 两种划分方法:行政区域划分法和按照公司的实际情况或内部规定划分法。 行政区域划分法,适合于前期的导入工作,但是会忽略许多重要的信息,比如2个区域的边界地带的物流和交通状况,更严重的是会发生经销商管理混乱,出现串货乱价的情况。 在对市场有了一定的了解之后,特别是开始了开拓工作之后,应该结合公司的实际情况,按照公司的市场战略部署、规划,来进行划分区域。 2、分析每个片区的零售店情况,主要了解各个片区内的批发、K/A、B、C店,特殊渠道等数量、分布位置。 二、制定铺市时候采用的销售策略 市场调查完之后,根据数据分析的结果,制定合适的销售策略。 采用的销售策略或模式,还应结合铺市产品的类别等因素综合考虑。 三、铺市人员的分配 方法一渠道专门队伍。每一种渠道设立一支专门的铺市队伍。如K/A渠道设K/A队伍,专门负责大卖场,大型连锁店、百货商场,超市等大客户;中小型店设小店组,专门负责小店、酒楼等;特殊渠道组专门负责夜店、车站码头、机场等客户。 方法二以片区来分配人员,设立一支队伍,对每个片区逐个铺市。每个片区铺市人员的分配,取决于该片区客户数量的多少,也和该片区客户的分布情况,铺市人员拜访频率的设定,拜访路线的规划息息相关,所以应该综合考虑以上几点因素,统筹规划。 四、客户数的分配 零售店的分配,要公平客观地为铺市人员设定每天的拜访客户数及类型,每个片区的情况不同,应适当调配,但以保证铺市人员的每天工作量是饱和,工作是有效率的为标准。 五、交通工具的使用 使用摩托车比踩单车要快,踩单车要比步行省时。减少在途时间,意味着每天拜访客户数量的增多,意味着效率的提高,意味在商战中抢得先机。 当然,使用那种交通工具,也要结合实际。在客户分布集中,拜访路线较短,工作效率有保障的情况下,不必使用最优方式,采用适合的方式就可以了。一味地配备最好的交通根据,一来会使得铺市成本增加,而且会使铺市人员产生懒惰、依赖情绪,造成效率的下降。 六、时间的有效运用

快速、有效的十大终端铺货策略

只有消费者在终端售点见到产品,才有消费购买的可能。为什么凭借高空广告狂轰烂炸的健力宝第五季在市场上昙花一现?终端铺货不到位是其败走麦城的根本原因! 终端铺货的重要性不言而喻,但铺货并不是企业或经销商想铺就能把货顺利铺下去的,铺货的产品、铺货人员的能力、终端阻力等种种因素决定着铺货的结果,但最关键的还是要有正确的铺货策略,思路决定出路,策略对路,铺货工作就成功了一半。 那么,在营销实战中,可以采取哪些策略来有效减小铺货阻力呢? 第一:铺货奖励 中国人讲究“礼尚往来”,针对终端的铺货政策能够迅速拉近产品和终端的距离。在产品同质化的情况下,很多终端进货看重的并不是企业的产品和品牌,而是铺货附带的优惠政策。在产品上市阶段,企业协同经销商主动出击,并根据情况给予终端一定的铺货奖励,从而拉动终端店进货。如果按奖励方式来进行分类,铺货奖励有很多种,比如定额奖励、坎级奖励、进货奖励、开户奖励、促销品支持、免费产品等。 第二:先易后难 在铺货过程中如果阻力太大,要善于结合铺货过程进行分析研究,通过初次的铺货试点要总结,哪些类型终端容易铺,哪些市场区域容易铺,可以采取先易后难的铺货策略,在铺货渠道上避开竞争,注意被大家所忽视的终端或者是挖掘新的终端网点,开辟新的销售渠道。 快消品一般都是多类型的终端,比如白酒有餐饮类、名烟名酒店、超市和便利店类终端售点,要结合渠道竞争情况,在前期走量大的终端比如白酒的餐饮终端较难铺的时候,可以先考虑从便利店等小型终端售点进入。在城市的中心区域铺货阻力大的时候,可以考虑从城区周遍开始铺货,走农村保卫城市之路。 第三:适当铺底 对于中小企业来说,在无法大规模投入广告来拉动终端销售的情况下,要想现款铺货是很难的,如果硬要求现款铺货,反而会导致销售成本更高。在这种情况下,可以通过采取适量铺底的方式来减小铺货阻力,达到较高的铺货率。也就是说,企业或经销商提供给终端的的铺底货款暂不收回,待其卖完后第二次进货时,才要求现金交易。但铺底数量必须严格限制,同时配合必要的推广活动,使零售终端尽快产生销售,快速进入良性循环。

TI_zigbee协议栈结构分析应用

无线盛世《快速进入ZB世界》
Ver:1

进入Zigbee世界的准备工作
§ 首先,我们需具备一些硬件设备及平台。以下 我就罗列一下Zigbee开发基本工具: § 计算机:不管是设计电路还是编程开发都是离 不开它的。 § Zigbee开发板:对于初学者来说,Zigbee开发 板无疑是最佳选择。有了开发板,你可以在我 们成熟设计的基础上学习或者做自己的设计。 § Zigbee模块:集MCU,RF,天线设计于一体 的Zigbee模块。使用它,我们可省去设计天线 及IC周边电路设计的复杂工作。

进入Zigbee世界的准备工作
§ Zigbee仿真器:是集烧写程序、在线编程和在线仿真 功能于一身的开发过程工作中必不可少的开发工具。 编程器既能对CC243x芯片(其实包括TI产品中的CC 系列的大部分芯片)进行烧写程序(hex标准文件程序 ),也能对CC243x芯片进行在线编程和仿真,让我们 能方便地在线调试开发,从而大大地提高了开发效率 。 § Zigbee协议分析仪:ZigBee的设计开发者必不可少的 工具!ZigBee协议分析仪具有广泛的功能,包括:分 析以及解码在PHY、MAC、NETWORK/SECURITY、 APPLICATION FRAMEWORK、和APPLICATION PROFICES等各层协议上的信息包;显示出错的包以 及接入错误;指示触发包;在接收和登记过程中可连 续显示包。

进入Zigbee世界的准备工作
§ 再次,我们需要在将用于开发Zigbee的计 算机平台上安装这些软件: § Zigbee协议分析软件(sniffer) § 程序烧写软件(Flash Programmer) § IAR公司的EW8051 version 7.20I/W32 。

C++_编译器常见提示错误_相关解析

fatal error C1003:error count exceeds number;stopping compilation 中文对照:(编译错误)错误太多,停止编译 分析:修改之前的错误,再次编译 fatal error C1004:unexpected end of file found 中文对照:(编译错误)文件未结束 分析:一个函数或者一个结构定义缺少“}”、或者在一个函数调用或表达式中括号没有配对出现、或者注释符“/*…*/”不完整等 fatal error C1083:Cannot open include file:'xxx':No such file or directory 中文对照:(编译错误)无法打开头文件xxx:没有这个文件或路径 分析:头文件不存在、或者头文件拼写错误、或者文件为只读 fatal error C1903:unable to recover from previous error(s);stopping compilation 中文对照:(编译错误)无法从之前的错误中恢复,停止编译 分析:引起错误的原因很多,建议先修改之前的错误 error C2001:newline in constant 中文对照:(编译错误)常量中创建新行 分析:字符串常量多行书写 error C2006:#include expected a filename,found'identifier' 中文对照:(编译错误)#include命令中需要文件名 分析:一般是头文件未用一对双引号或尖括号括起来,例如“#include stdio.h” error C2007:#define syntax 中文对照:(编译错误)#define语法错误 分析:例如“#define”后缺少宏名,例如“#define” error C2008:'xxx':unexpected in macro definition 中文对照:(编译错误)宏定义时出现了意外的xxx 分析:宏定义时宏名与替换串之间应有空格,例如“#define TRUE"1"” error C2009:reuse of macro formal'identifier' 中文对照:(编译错误)带参宏的形式参数重复使用 分析:宏定义如有参数不能重名,例如“#define s(a,a)(a*a)”中参数a重复 error C2010:'character':unexpected in macro formal parameter list 中文对照:(编译错误)带参宏的形式参数表中出现未知字符 分析:例如“#define s(r|)r*r”中参数多了一个字符‘|’ error C2014:preprocessor command must start as first nonwhite space 中文对照:(编译错误)预处理命令前面只允许空格 分析:每一条预处理命令都应独占一行,不应出现其他非空格字符 error C2015:too many characters in constant 中文对照:(编译错误)常量中包含多个字符 分析:字符型常量的单引号中只能有一个字符,或是以“\”开始的一个转义字符,例如“char error='error';”error C2017:illegal escape sequence 中文对照:(编译错误)转义字符非法 分析:一般是转义字符位于''或""之外,例如“char error=''\n;” error C2018:unknown character'0xhh' 中文对照:(编译错误)未知的字符0xhh 分析:一般是输入了中文标点符号,例如“char error='E';”中“;”为中文标点符号

铺货管理的九个步骤讲解

铺货治理的九个步骤 以上种种误区,经常会造成铺市工作的失败,产生许多负面的阻碍,比如,打击营销人员、批发商、经销商的积极性;打破企业的整体销售打算、增加企业后续工作的难度;损伤经销商的感情、白费企业和经销商的人、财、物等。那么企业如何才能做好铺货治理工作呢? 第一步铺货信息的扫描 1.了解目标区域市场情况 在铺货的预备时期,企业首先应该了解目标区域市场的相关情况,诸如整个市场的特征、产品销售整体状况、消费者的消费趋势、消费适应等,因此,销售终端的经营特点和性质是最为关键的一环。一般来讲,要紧内容如下表:

企业了解终端市场,切忌大刀阔斧,不认真认真,图虚荣、高成本、吝啬“体力”;在了解终端情况的过程中,调查人员应该尽量采纳画图、填表、归档的方式,靠脑筋经历不可靠。了解终端的方法要紧有: ·“扫街”式的走访、观看,所谓百闻不如一见。 ·同行(竞品)跟随,因为一般情况下,竞争对手有他自己的方法。 ·与当地业内人士(批发商、商场人员)的访谈,专门多时候,经验之谈会减少你的许多失误和减少不必要 的白费。 ·消费者的调研,以便弄清晰消费者到底喜爱或适应在哪里购买。 ·资料的收集与查阅,比如调研公司、统计部门或新闻媒体的一些调研报告或文章。 ·自己企业原有的一些调研和资料,也包括一些经验的类

推。 可口可乐在进入新市场前,必定要求对选定的区域内的所有饮料销售终端(注意是“所有”)进行全面调查,搜集详细资料以便进行终端铺货时用,或在今后能为客户提供更优良的服务。而搜集小店数据是最为琐碎、长久的一项销售行为。 为了有效地开展工作,培训差不多扫街程序,访问技巧和沟通训练是第一步,接下来最关键的确实是:如何保证散落在各处的小店资料不遗漏,以及能保证调查的顺利实施。要明白扫街中每天的行为差不多上:早会、行走、标图、记录和晚会,日复一日,周而复始,单调而又复杂,需要极高的工作热情;而且工作过程中还要求你认真、认真、真实、不遗漏、不重复,按时完成当天调查任务(每人每天调查35家售点或更多)。 关于早会工作讲明、终端调查路线行下次规则、调查表格填写注意事项和晚会工作内容都有明确的规定(见下表) 早会工作讲明 3 / 11

相关文档
最新文档