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房间有事件处理。

 

  以上是个人理解OSAL运行的。那么指示灯怎么亮起来的,我们也叫事件的捕获

你可能感兴趣的:(zigbee)