ZigBee ZStack 协议栈学习--架构分析篇
2017-03-01 16:18
405 查看
本文着重分析ZStack(V3.0)的程序架构,只保留最重要的部分,其他部分暂时略过。。。
1.ZStack程序是从main()函数开始的:打开IAR工程->ZMain文件夹->ZMain.c文件
main函数包含两个重要的函数如下:系统初始化函数osal_init_system()和启动系统函数osal_start_system()
int main( void )
{
……
osal_init_system();
osal_start_system();
……
}
2.系统初始化函数osal_init_system()中包含一个重要函数任务初始化函数osalInitTasks();
uint8 osal_init_system( void )
{
……
osalInitTasks();
……
}
3.任务初始化函数osalInitTasks()中与之相关的三个参数:
tasksEvents:指向事件表首地址的指针
tasksCnt:任务总数
tasksArr[]:任务处理函数的指针数组
void osalInitTasks( void )
{
a.定义一个tasksEvents指针指向tasksArr[]
b.清空数组缓存区为0
c.从底层到应用层依次调用任务初始化函数,并分配taskID,每层+1
}
4.启动系统函数osal_start_system()中一个死循环,重复调用osal_run_system()函数
void osal_start_system( void )
{
for(;;)
{
osal_run_system();
}
}
5.osal_run_system()函数先按照自底向上查询事件表,有任务的事件发生,则调用任务处理函数,如APP层有事件发生调用zclSampleApp_event_loop()函数处理
void osal_run_system( void )
{
do{
if (tasksEvents[idx]) //自底向上查询每层是否有事件发生
{
break;
}
} while (++idx < tasksCnt);
if (idx < tasksCnt)
{
events = tasksEvents[idx];
tasksEvents[idx] = 0; //暂时清空事件标志位
events = (tasksArr[idx])( idx, events );//调用任务处理函数进行处理
tasksEvents[idx] |= events; //将未处理完的事件重新置位
}
}
6.在任务处理函数中,基本框架如下:
uint16 zclSampleApp_event_loop( uint8 task_id, uint16 events )
{
if ( events & SYS_EVENT_MSG )//提取系统事件:接收到数据、按键状态改变、网络状态改变等
{
while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclSampleApp_TaskID )) )//接收该任务ID对应的消息队列中的数据
{
switch ( MSGpkt->hdr.event ){
case ZCL_INCOMING_MSG:
zclSampleApp_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt );
break;
……
default:
break;
}
}
return (events ^ SYS_EVENT_MSG);//处理完成,将事件标志位清0
}
if ( events & SAMPLEAPP_END_DEVICE_REJOIN_EVT )//提取用户自定义事件
{
bdb_ZedAttemptRecoverNwk();//事件处理函数
return ( events ^ SAMPLEAPP_END_DEVICE_REJOIN_EVT );//处理完成,清空事件标志位
}
……
}
1.ZStack程序是从main()函数开始的:打开IAR工程->ZMain文件夹->ZMain.c文件
main函数包含两个重要的函数如下:系统初始化函数osal_init_system()和启动系统函数osal_start_system()
int main( void )
{
……
osal_init_system();
osal_start_system();
……
}
2.系统初始化函数osal_init_system()中包含一个重要函数任务初始化函数osalInitTasks();
uint8 osal_init_system( void )
{
……
osalInitTasks();
……
}
3.任务初始化函数osalInitTasks()中与之相关的三个参数:
tasksEvents:指向事件表首地址的指针
tasksCnt:任务总数
tasksArr[]:任务处理函数的指针数组
void osalInitTasks( void )
{
a.定义一个tasksEvents指针指向tasksArr[]
b.清空数组缓存区为0
c.从底层到应用层依次调用任务初始化函数,并分配taskID,每层+1
}
4.启动系统函数osal_start_system()中一个死循环,重复调用osal_run_system()函数
void osal_start_system( void )
{
for(;;)
{
osal_run_system();
}
}
5.osal_run_system()函数先按照自底向上查询事件表,有任务的事件发生,则调用任务处理函数,如APP层有事件发生调用zclSampleApp_event_loop()函数处理
void osal_run_system( void )
{
do{
if (tasksEvents[idx]) //自底向上查询每层是否有事件发生
{
break;
}
} while (++idx < tasksCnt);
if (idx < tasksCnt)
{
events = tasksEvents[idx];
tasksEvents[idx] = 0; //暂时清空事件标志位
events = (tasksArr[idx])( idx, events );//调用任务处理函数进行处理
tasksEvents[idx] |= events; //将未处理完的事件重新置位
}
}
6.在任务处理函数中,基本框架如下:
uint16 zclSampleApp_event_loop( uint8 task_id, uint16 events )
{
if ( events & SYS_EVENT_MSG )//提取系统事件:接收到数据、按键状态改变、网络状态改变等
{
while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( zclSampleApp_TaskID )) )//接收该任务ID对应的消息队列中的数据
{
switch ( MSGpkt->hdr.event ){
case ZCL_INCOMING_MSG:
zclSampleApp_ProcessIncomingMsg( (zclIncomingMsg_t *)MSGpkt );
break;
……
default:
break;
}
}
return (events ^ SYS_EVENT_MSG);//处理完成,将事件标志位清0
}
if ( events & SAMPLEAPP_END_DEVICE_REJOIN_EVT )//提取用户自定义事件
{
bdb_ZedAttemptRecoverNwk();//事件处理函数
return ( events ^ SAMPLEAPP_END_DEVICE_REJOIN_EVT );//处理完成,清空事件标志位
}
……
}
相关文章推荐
- Zigbee学习(二)之Zstack协议栈运行原理分析
- ZigBee ZStack 协议栈学习-- 一个数据包的艺术之旅
- 【深度分析Zigbee】Zstack协议栈初窥(六):协调器的组网过程详解
- 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的基本架构和工作机理
- zigbee学习笔记1----安装zstack协议栈
- Zigbee学习(三)之Zstack协议栈应用实践
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析
- Android 电话相关架构及源代码分析和学习
- ZIGBEE-ZSTACK协议栈中UART的两种模式
- Zigbee学习Zstack【转】
- ZigBee学习之13——ZStack ZDO和AF层API解读
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析
- ZigBee精简协议栈学习
- ZigBee学习之16——ZStack -APS层NWK层API解读4 、5
- ZIGBEE学习之---ZSTACK1.4.3修改密钥(CC2430)
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析
- ZigBee学习笔记_GenericApp分析
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析