BLE中OSAL的运行机理怎么理解?
2017-06-19 13:13
411 查看
OSAL的中文意思就是操作系统抽象层
在蓝牙4.0BLE协议栈中,OSAL负责调度各个任务的运行,如果有事件发生了,则会调用相应的事件处理函数进行处理,其工作原理示意图如下。
![](https://img-blog.csdn.net/20170619111348845?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpbGV4dWV4aTEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1.其中,值得我们关注的就是事件和事件处理函数是如何联系起来的呢?
(1)首先,建立一个事件表,保存各个任务对应的事件,建立另一个函数表,保存各个任务事件处理函数的地址,然后对这两个表建立某种对应关系,当某一个事件发生时则查找到相应的事件处理函数即可。
(2)现在问题转换为:用什么样的数据结构来实现时间表和函数表呢?如何将事件表和函数表建立某种对应关系呢?
在蓝牙4.0BLE协议栈中,有三个变量至关重要!!!!!!
1)taskCnt:该变量保存了任务的总个数。
该变量的声明为:uint8 taskCnt。其中uinit8的定义为:typedef unsigned char uinit8。
2)taskEvents:是一个指针,指向了事件表的首地址。
该变量的声明为:uinit16 *taskEvents。其中uinit16的定义为:typedef unsigned short uinit16。
3)taskArr:这是一个数组,该数组的每一项都是一个函数指针,指向了事件处理函数。该数组的声明:
pTaskEventHandlerFn task[]。其中pTaskEventHandlerFn的定义如下:
type unsigned short (*pTaskEventHandlerFn)(unsigned char task_id,unsigned short event)
这定义了一个函数指针。
所以taskArr数组的每一项都是一个函数指针,指向了对应的事件处理函数。其中事件表和函数表的关系如下图所示。
![](https://img-blog.csdn.net/20170619130401745?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpbGV4dWV4aTEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们谈到这里不知道大家有没有清楚认识一点,我接着总结一下:
OSAL的工作原理就是通过taskEvents指针方位事件表的每一项,如果有事件发生,则查找函数表找到事件处理函数进行处理,处理完后,继续访问事件表,查看是否有事件发生,无线循环。
从某种意义上说,OSAL是一种基于事件驱动的轮训是操作系统。事件驱动是指发生事件后采取相应的事件处理方法,轮训是指不断的查询是否有事件发生。
在蓝牙4.0BLE协议栈中,OSAL负责调度各个任务的运行,如果有事件发生了,则会调用相应的事件处理函数进行处理,其工作原理示意图如下。
1.其中,值得我们关注的就是事件和事件处理函数是如何联系起来的呢?
(1)首先,建立一个事件表,保存各个任务对应的事件,建立另一个函数表,保存各个任务事件处理函数的地址,然后对这两个表建立某种对应关系,当某一个事件发生时则查找到相应的事件处理函数即可。
(2)现在问题转换为:用什么样的数据结构来实现时间表和函数表呢?如何将事件表和函数表建立某种对应关系呢?
在蓝牙4.0BLE协议栈中,有三个变量至关重要!!!!!!
1)taskCnt:该变量保存了任务的总个数。
该变量的声明为:uint8 taskCnt。其中uinit8的定义为:typedef unsigned char uinit8。
2)taskEvents:是一个指针,指向了事件表的首地址。
该变量的声明为:uinit16 *taskEvents。其中uinit16的定义为:typedef unsigned short uinit16。
3)taskArr:这是一个数组,该数组的每一项都是一个函数指针,指向了事件处理函数。该数组的声明:
pTaskEventHandlerFn task[]。其中pTaskEventHandlerFn的定义如下:
type unsigned short (*pTaskEventHandlerFn)(unsigned char task_id,unsigned short event)
这定义了一个函数指针。
所以taskArr数组的每一项都是一个函数指针,指向了对应的事件处理函数。其中事件表和函数表的关系如下图所示。
我们谈到这里不知道大家有没有清楚认识一点,我接着总结一下:
OSAL的工作原理就是通过taskEvents指针方位事件表的每一项,如果有事件发生,则查找函数表找到事件处理函数进行处理,处理完后,继续访问事件表,查看是否有事件发生,无线循环。
从某种意义上说,OSAL是一种基于事件驱动的轮训是操作系统。事件驱动是指发生事件后采取相应的事件处理方法,轮训是指不断的查询是否有事件发生。
相关文章推荐
- ble学习笔记九----------ble协议栈之OSAL的运行机理
- ble学习笔记九----------ble协议栈之OSAL的运行机理
- 怎么理解C++编译、连接、运行
- 怎么理解西宁奥克梅装箱机的运行?
- 在Tomcat中理解Servlet的运行机理
- 对ARM加载域和运行域的理解(ARM程序是怎么运行的) .
- 理解代码是怎么运行的
- 对ARM加载域和运行域的理解(ARM程序是怎么运行的)
- Zigbee协议栈中OSAL的运行机理
- 在Tomcat中理解Servlet的运行机理
- web2.0- -这个冬冬怎么理解??
- linux怎么把自己的程序作为后台程序运行
- 页面上有个添加按钮,程序运行成功的,当我添加一条记录后刷新页面,它自动又添加一条,这样怎么修改?
- 怎么使LUMAQQ在WIN98下运行-已经自行解决,遇到同样问题的人请来看
- 在地址栏怎么能运行javascript?
- 误用组策略的禁止程序运行怎么办?
- 怎么使LUMAQQ在WIN98下运行-已经自行解决,遇到同样问题的人请来看
- [proxies.pas怎么了?]关于delphi6以后组件设计包和运行包分开的话题
- MFC程序的构造过程和运行机理初探
- VB程序怎么判断另一个程序是否正在运行?