大家好,我是皮皮猫吖!
每文一言:你可以拒绝学习的动力,但是你的竞争者不会!
本篇文章:
主要是讲解协议栈OSAL操作系统的执行流程。
正文如下:
一、OSAL操作系统
1)应用层是一个任务,它有一个系统分配给的唯一数值编号叫任务ID。
① 任务ID初始化
2)任务可以处理事件,处理事件的这些代码都保存在一个函数里,这个函数叫任务事件处理函数。每一个任务都有一个对应的任务事件处理函数。
① 应用层的任务事件处理函数:
//应用层需要处理的事件
//几个if就是几个事件,默认是两个事件(系统事件和其他事件)
//下述事件是CC2530的事件处理函数
UINT16 PPMApp_ProcessEvent( byte task_id, UINT16 events )
3)应用层任务还有一个2个字节的变量:任务事件变量。
① 任务事件变量
4)任务事件变量和事件号之间的关系【应用层任务事件变量、应用层事件号】
应用层任务事件变量和应用层定义的事件的关系,如果任务事件变量和某个事件的宏值进行与操作为1,那么表示应用层任务将要处理这个事件。
任务事件变量 | 事件名 |
---|---|
0x0003 | 0x0001 |
0x0002 | |
0x0003 |
该0x0003任务事件变量与0x0001事件、0x0003事件进行与操作都是1,所以,该任务会触发0x0001事件和0x0003事件。
5)轮询机制
① 轮询机制
② 系统在运行的时候会不断的去读应用层任务事件变量
当它发现这个变量为0。就认为应用层任务当前没有事件需要去处理。
如果发现这个变量不为0,它就认为应用层任务有事件将要去处理,它就会去调用应用层任务事件处理函数UINT16 SDApp_ProcessEvent( byte task_id, UINT16 events ),并且把任务事件变量的值传给events;在这个事件处理函数里,events会分别和应用层定义的所有事件宏值进行与操作,如果与操作之后的结果为1,那么就去执行这个事件处理的相应代码。
③ 应用层任务事件处理函数
5)设置任务事件函数
① 设置任务事件函数
② 调用任务事件函数osal_set_event(SDApp_TaskID, SDApp_SEND_MSG_EVT),SDApp_TaskID就会去执行SDApp_SEND_MSG_EVT事件相应的处理代码?
- 解释一:
在osal_set_event函数中,任务事件变量和需要触发事件的宏先进行或操作,此时任务事件变量在要触发事件的对应位就被置为1,此时系统检测任务事件变量是否为0,不为0,任务事件变量与事件进行与操作,结果为1,执行该事件。
- 解释二:
把SDApp_TaskID(应用层任务)的任务事件变量中对应于SDApp_SEND_MSG_EVT宏值为1的那一位变成1(相当于SDApp_TaskID和SDApp_SEND_MSG_EVT进行与操作必为1)。这样话,这个任务事件变量就变成了非0,系统检测到任务事件变量为非0时,就会去调用任务事件处理函数SDApp_ProcessEvent,在这个函数里,任务事件变量和SDApp_SEND_MSG_EVT宏值进行与操作为1,所以必定会执行这个事件(SDApp_SEND_MSG_EVT事件)相关的代码。
6)每个层都有各自的任务
每一个层都是一个任务,那么每一个层都有1个任务ID、任务事件处理函数、任务事件变量。
① 任务事件处理函数
FUN函数数组 = {任务事件处理A, 任务事件处理B, 任务事件处理C…}
② 任务事件变量
Arr变量数组={任务事件变量a, 任务事件变量b, 任务事件变量c…}【保存着各层任务事件变量】
③ 任务ID
任务ID系统不是随便分配,我们可以通过这个值立即找到这个任务自己的任务事件处理函数和任务事件变量。
④ 任务ID和任务事件处理函数、任务事件变量的关系:
- 任务事件处理函数0:Arr[0]
- 任务事件变量0:Event[0]
⑤ 注意【应用层任务ID】
- 应用层任务的任务ID是8
⑥ 应用层任务事件处理函数、应用层任务事件变量
应用层任务处理函数: tasksArr[8]
应用层任务事件变量: tasksEvents[8]
7)在协议栈中要关注两个函数
① Zmain.c中的osal_init_system()函数
osal_init_system();//在Zmain中,初始化操作系统
② osal_init_system中的osalInitTasks()函数
osalInitTasks();//操作系统给所有的任务分配ID
osalInitTasks中的tasksCnt
- tasksCnt表示当前系统的任务数
8)关注osal_start_system()函数
所有ZSTACK协议栈在稳定工作的时候,它的行为是在for(; ; ){}死循环中。
不断地去读取所有任务的任务事件变量,如果发现所有任务的任务事件变量都为0,说明所有任务都没有事件将要去处理;再次重复这个过程,直到发现某个任务事件变量不为0,就会通过不为0的这个任务ID找到这个任务事件处理函数,去处理相应的事件。
当设置了要调用任务事件函数的时候(osal_set_event()),任务事件变量的值会被修改为原任务事件变量和任务事件进行或操作之后的值,此时执行osal_start_system()函数,在此函数中不断的检测任务事件变量的值,存在某任务事件变量值不为0。
触发任务事件函数(触发应用层任务事件函数),在应用层事件函数中,判断哪个事件和任务事件变量进行与操作为1,为1的即为要进行的事件操作
希望本篇文章对大家有所帮助,后续会继续分享Zigbee相关学习知识…
如果文章内容有错误的地方,请在留言处留下你的见解,方便大家共同学习。谢谢!
如有侵权或其他任何问题请联系:QQ1370922071,本文主要用于学习交流,转载请声明!
作者:皮皮猫吖