Zigbee学习日记(八)(下)OSAL操作原理
goJhou 发布于2018-01 浏览:3675 回复:1
1
收藏

应用层有一个任务,并匹配有一个唯一的任务ID。

任务中可以处理事件,存在有一个事件处理函数,所有事件处理过程都在函数内。

应用层的任务还有1个2个字节长的变量,称为任务事件变量。如果事件变量和某个事件宏值与操作为1,则表示应用层任务将处理这个事件。详情的体现情况可以查看事件处理函数,它的内部有与所有事件进行与运算。

系统在运行时会不断地读应用层任务事件变量,当它为0时,就认为应用层任务当前没有事件需要处理(队列为空),如果发现不为0,那么它就会认为应用层有事件将要处理,就会调用应用层事件处理函数ProcessEvent(byte task_id,UINT16 events),并且将任务事件变量传给events形参。在这个事件处理函数里,events变量会分别和所有应用层定义的所有事件宏值进行与操作,并执行对应的事件代码。

那其实当我们调用uint8 osal_set_event(uint8 task_id,uint16 event_flag)时,其实就是把任务ID中的事件变量或上了flag,使之成为非0事件变量,然后触发事件处理函数。

几乎每一层都是一个任务,每一层都有一个任务ID,事件处理函数,事件变量

并且所有的事件处理函数由一个数组集中

函数数组={事件处理A,事件处理B,…}

变量数组={事件变量A,事件变量B,…}

通过数组下标来获取事件处理函数和事件变量。

应用层任务的任务ID是8。也就是函数数组中的第8个元素。

在应用层OSAL开头的文件中的osalInitTasks中会给所有任务分配ID。

在OSAL/OSAL.c中的osal_run_system函数可以看到事件变量的轮询过程

系统在初始化完成后会一直死循环处理这个函数,来查看是否要执行事件

所以ZStack稳定工作时,他的行为就是在死循环里不断的读事件变量。如果都为0就继续读。

收藏
点赞
1
个赞
共1条回复 最后由用户已被禁言回复于2022-04
#2荒墨丶迷失回复于2018-01

实力解说,赞一个

1
TOP
切换版块