对于这个问题,zigbee采用的方法是:建立一个事件表,保存各个任务的对应的事件,建立另一个函数表,保存各个任务事件处理函数的地址,然后将这两张表建立某种对应关系,当某一事件发生时则查找函数表找到对应的事件处理函数即可。
那么,在zigbee中,用什么样的数据结构来实现事件表和函数表呢?如何将事件表和函数表建立对应关系呢?我们现在就来探讨一下这个问题。
在zigbee协议栈中,有三个变量至关重要:
1,tasksCnt——该变量保存了任务的总个数
该变量的声明为:uint8 tasksCnt,其中uint8的定义为:typedef unsigned char uint8
2,tasksEvent——这是一个指针,指向了事件表的首地址
该变量的声明为:uint16 *tasksEvent,其中uint16的定义为:typedef unsigned short uint16
3,tasksArr——这是一个数组,该数组的每一项都是一个函数指针,指向了事件处理函数。该数组的声明为:pTaskEventHandlerFn tasksArr[],其中pTaskEventHandlerFn的定义(这个定义需要特别的注意)为:typedef unsigned short (*pTaskEventHandlerFn)(unsigned char task_id,unsigned short event),这是定义了一个指针。因此,tasksArr数组的每一项都是一个函数指针,指向了事件处理函数。
事件表和函数表的对应关系如下图所示:
tasksEvent[tasksCnt] ——————> GenericApp_ProcessEvent tasksArr[tasksCnt]
............. ——————>........... .............
............. ——————>........... .............
............. ——————>........... .............
tasksEvent[2] ——————> Hal_ProcessEvent tasksArr[2]
tasksEvents——> tasksEvent[1] ——————> nwk_event_loop tasksArr[1]
tasksEvent[0] ——————> macEventLoop tasksArr[0]
^
|
tasksArr[]
那么,我们就可以知道了这种对应关系了。但是请务必注意,tasksEvents数组中的每个任务都是一个uint16类型的数据,它是该任务对应的事件的集合,即一个任务可以对应多个事件。
我们知道,OSAL是一种基于事件驱动的轮询式操作系统(事件驱动指的是发生事件后采取相应的事件处理方法,轮询指的是不断地查看是都有事件发生)。那么,结合我们之前所学习和接触到的内容,从这里的对应关系我们也可以总结出OSAL的工作原理:通过tasksEvents指针访问事件表的每一项,如果有事件发生,则查找函数表找到事件处理函数进行处理,处理完后,继续访问事件表,查看是否有事件发生,无限循环。 |