您的位置:首页 > 运维架构 > 网站架构

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 );//处理完成,清空事件标志位
    }
    ……

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: