查看: 7866|回复: 4

zigbee中事件和任务的事件处理函数的联系

[复制链接]
葬花、残荣 发表于 2012-10-5 15:45:50 | 显示全部楼层 |阅读模式

       对于这个问题,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指针访问事件表的每一项,如果有事件发生,则查找函数表找到事件处理函数进行处理,处理完后,继续访问事件表,查看是否有事件发生,无限循环。
panjun19890204 发表于 2012-11-7 20:53:04 | 显示全部楼层
taskCnt最大是不是240?我理解的任务就是应用层的程序。
 楼主| 葬花、残荣 发表于 2012-11-8 09:40:08 | 显示全部楼层
是的~~~~~~~~
kmalachen 发表于 2012-12-13 22:17:12 | 显示全部楼层
大作拜读了。。感谢……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表