ZStack协议栈学习:
应用层(app)编写程序
osal任务消息处理的机制概要就是:
基本每层都是一个任务,都对应的任务ID。
每个任务又可以处理多个事件,事件ID为两个字节,且只能有一位为1,故每个任务最多只能处理16个不同的事件。系统事件SYS_EVENT_MSG的宏值为0x8000。osal_set_event( byte task_id, UINT16 event_flag ) 该函数设置事件。
系统事件又可以处理多个消息,使用switch语句判断投递过来的是哪个消息,并处理。同样有很多系统消息。定义消息的宏为一个字节,且可以任意取值。osal_msg_send( byte destination_task, byte *msg_ptr ) 该函数投递消息。
任务事件变量events和任务事件宏的关系(SampleApp_ProcessEvent( )函数中):
如果事件变量与某个事件宏值相与的结果为真,则代表任务要处理这个事件,并在最后返回异或后的值,将相同位变为0,表示该事件已被处理。例如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
if ( events & SYS_EVENT_MSG ) { afIncomingMSGPacket_t *MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); while ( MSGpkt != NULL ) { switch ( MSGpkt->hdr.event ) { case KEY_CHANGE: //...... break; case AF_DATA_CONFIRM_CMD: //...... break; case AF_INCOMING_MSG_CMD: //...... break; case ZDO_STATE_CHANGE: //...... break; default: break; } osal_msg_deallocate( (uint8 *)MSGpkt ); MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID ); } // Return unprocessed events. return ( events ^ SYS_EVENT_MSG ); }