首先上图,跟着图中的函数顺序来感受Z-Stack的工作流程:
Z-Stack协议栈总的来说做了两件事,系统的初始化和启动OSAL操作系统。
系统初始化:从main函数看,首先是调用了osal_init_system()函数,它的主要功能是初始化操作系統所有的任务,通过IAR的跟踪功能,得到它的函数体如下图:
其中最主要的函数是osalInitTasks(),它初始化了系统的任务,跟踪到其函数体如下如图:
首先为事件任务数组申请了内存空间,可以看到有个变量taskID,这是用于事件处理的任务号,这里初始化好任务号后,紧接着开始OSAL,在main函数中调用osal_start_system()函数。跟踪到函数体中发现是一个死循环:
在osal_run_system()函数中会循环遍历系统所有任务的事件,不为0则有事件发生,然后再去处理相应的事件。跟踪到函数中可以看到其使用一个do while语句实现循环遍历:
如果有任务事件产生,则调用相应的事件处理进程,
事件处理使用的是函数指针处理,tasksArr数组中存放的都是函数指针,如下图:
为了使其能够准确的调用相应的任务事件处理函数,tasksEvents[]与tasksArr[]的元素必须相对应。
根据元素的排列顺序就可知他们的优先级,排在前面的优先级更高。
对于用户事件的处理函数在APP应用层下的MyApp.c(每个人的文件名可能不一样)文件中的MyApp_ProcessEvent函数:
MyApp_ProcessEvent函数是我们用户自定义的函数,比如我们定义的按键事件等都需要在该函数下实现,首先利用(afIncomingMSGPacket_t
*)osal_msg_receive( MyApp_TaskID )从消息队列中获取消息,如果有消息则用switch结构根据消息的子事件,判断是什么事件的发生,处理完事件后需要释放空间,然后接着从消息队列接收消息,最后返回处理后的events(events ^ SYS_EVENT_MSG)。将events重新赋值到tasksEvents中,继续轮询。