网蜂zigbee提问
老师好 ,我想问如下问题1.自定义事件在哪里定义?
2.消息结构在哪里定义及在哪里填充?
3.定义的事件如何触发?
hwapp_event()
{ osal_start_timerEx( SampleApp_TaskID, HWAPP_SEND_PERIODIC_MSG_EVT, (SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF)) ); }
上面的osal_start_timerE何时运行?是在 hwapp_event()运行之后运行 还是一直在运行? 你好,就你的提问,曾经在网上看到觉得描述得比较全面的:
在zstack的协议栈中一个任务下最多可以15个事件(除去系统的强制事件),那么这些事件是如何添加到任务中的呢?在这里我仅仅探讨一些用户自己的任务下的事件是如何添加的,至于APS层和网络层,这里暂不做过多的讲解。
先给出实现的两种方式,我仅仅知道两种方式,至于其他的方式暂且不知道,欢迎大家进行补充和指教。
1、 osal_set_event();使用这个函数,至于如何调用,大家看看介绍就知道了。这个函数在用户的任务初始化程序中添加。当所有的基本参数(端点,任务id,描述符等等)配置完毕后,调用这个函数。一般会放在最后一句。
2、在用户处理函数中添加。且看如下代码:
if ( events & SYS_EVENT_MSG )
{
MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );
while ( MSGpkt )
{
switch ( MSGpkt->hdr.event )
{
// Received when a key is pressed
case KEY_CHANGE:
SampleApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );
break;
// Received when a messages is received (OTA) for this endpoint
case AF_INCOMING_MSG_CMD:
SampleApp_MessageMSGCB( MSGpkt );
break;
// Received whenever the device changes state in the network
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if ( (SampleApp_NwkState == DEV_ZB_COORD)
// || (SampleApp_NwkState == DEV_ROUTER)
|| (SampleApp_NwkState == DEV_END_DEVICE) )
{
// Start sending the periodic message in a regular interval.
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
}
else
{
// Device is no longer in the network
}
break;
default:
break;
}
例如任务处理事件函数为uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events );
在这个函数里面可以看到上面的代码。可以看到当取出事件的消息后,消息中有一个为ZDO_STATE_CHANGE的消息,当节点加入网络后,节点的状态将会发生变化,这个时候这个消息就会被加入到系统消息事件的队列中,当执行用户事件的时候,这个消息就会被处理,然后就执行下面的
osal_start_timerEx( SampleApp_TaskID,
SAMPLEAPP_SEND_PERIODIC_MSG_EVT,
SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );
这个函数执行后,相应的事件就会加入到任务中。大家看看这个函数的定义就清楚了。第一个参数是对应任务的id,第二个参数是对应的事件id,第三个是对应事件的查询时间。
在原始程序中,并没有用到osal_set_event函数,而是用状态消息改变来处理的。
后来修改了很虚,在初始化任务的函数中,加入了osal_set_event这个函数,而将消息处理的处理路由器的那个位置可屏蔽掉,实验结果时一样的,路由器和协调器之间正常通信。
当不加入osal_set_event这个函数的时候,并且将路由器那个判断语句给屏蔽掉,结果无法正常通信。因此,实验结果证明,osal_set_event确实将事件添加到任务中去了。
希望对你有帮助!
页:
[1]