zigbee协议栈OSAL运行原理-----个人理解

OSAL运行原理:
前提:OSAL是按照不同层运行的。分别是应用层(App)、硬件层(HAL)、mac层(MAC).......等多个层。我们现在把每一层可以当成一个任务。也可以比喻每一层是一个房间。
开始运行:程序从main函数开始执行,一开始是初始化各个模块。然后初始化osal_init_system(),在这个函数里主要给各个层(各个房间)定义任务ID号。从0开始 假设应用层被分到的任务号是8。开始运行OSAL也就是这个函数osal_start_system(); 在这个函数里用了一个for循环这条语句for(;;),for循环就是来观察哪一层(哪个房间)有事件发生就去处理哪个层(房间)。这就是像高中老师查宿舍一下,如果哪个房间有声音、不熄灯等,老师就去处理,否则一直在走廊来回检查。
重点内容:我们人很复杂可以通过眼睛、耳朵等知道房间有事情发生,但是程序不知道。它是怎么处理的呢?
先来介绍每一层(房间)可能发生的事情或者处理的事情怎么表示。
其中tasksArr[]是函数指针。每个层(房间)会发生或者处理各种事情,比如应用层(应用房间)会处理模块类型,还有其他的事情。所有应用层能处理的事情用一个函数a来运行,所有硬件层处理的事物也用一个函数b表示,其它层分别是函数c、函数d等等那么我们把函数a,函数b,函数c。。。他们的地址放到tasksArr[]中。假设函数a的地址是100,函数b的地址是101,函数c的地址是102。。。。。等等 只要调用使用100 就会执行函数a,以此类推只要调用108就会执行函数h。
实际代码如下:
const pTaskEventHandlerFn tasksArr[] = {
macEventLoop,// tasksArr[0]对应房间100号
nwk_event_loop,// tasksArr[1]对应房间101号
Hal_ProcessEvent,// tasksArr[2]对应房间102号
#if defined( MT_TASK )
MT_ProcessEvent,
#endif
APS_event_loop,
#if defined ( ZIGBEE_FRAGMENTATION )
APSF_ProcessEvent,
#endif
ZDApp_event_loop,
#if defined ( ZIGBEE_FREQ_AGILITY ) || defined ( ZIGBEE_PANID_CONFLICT )
ZDNwkMgr_event_loop,
#endif
GenericApp_ProcessEvent// tasksArr[8]对应房间108号
};
现在我们来解决刚才提出的问题,检查老师眼耳并用可以知道房间情况。OSAL它怎么知道去各个层执行相应事件的呢,
这需要用到另一个变量tasksEvents[],这个变量也是一个数组,并且与刚才的tasksArr[ ] 数组一一对应。即

tasksEvents[0]--------------对应tasksArr[0]
tasksEvents[1]--------------对应tasksArr[1]
tasksEvents[2]--------------对应tasksArr[2]
tasksEvents[3]--------------对应tasksArr[3]
也就是说tasksEvents正常为0,当不为0时说明对应层有事件发生。比如tasksEvents[8]不为0,程序就到tasksArr[8] 也就是108去执行了。
在for循环里面有一个do。。。。while循环,就是检测tasksEvents[]数组变量不为零,拿到ID号去对应房间处理事件。
比喻:老师不在去房间走廊检查,每个房间都有一个特殊的指示灯(这个指示灯是2个字节,也就是说可以亮16种颜色)放在老师办公室,老师只需要在办公室检查这些指示灯。如果tasksEvents[8]指示灯亮就知道108房间有事件处理。

【zigbee协议栈OSAL运行原理-----个人理解】以上是个人理解OSAL运行的。那么指示灯怎么亮起来的,我们也叫事件的捕获

    推荐阅读