BLE中OSAL的运行机理怎么理解?

OSAL的中文意思就是操作系统抽象层

在蓝牙4.0BLE协议栈中,OSAL负责调度各个任务的运行,如果有事件发生了,则会调用相应的事件处理函数进行处理,其工作原理示意图如下。

BLE中OSAL的运行机理怎么理解?_第1张图片

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数组的每一项都是一个函数指针,指向了对应的事件处理函数。其中事件表和函数表的关系如下图所示。


BLE中OSAL的运行机理怎么理解?_第2张图片

我们谈到这里不知道大家有没有清楚认识一点,我接着总结一下:

 OSAL的工作原理就是通过taskEvents指针方位事件表的每一项,如果有事件发生,则查找函数表找到事件处理函数进行处理,处理完后,继续访问事件表,查看是否有事件发生,无线循环。

从某种意义上说,OSAL是一种基于事件驱动的轮训是操作系统。事件驱动是指发生事件后采取相应的事件处理方法,轮训是指不断的查询是否有事件发生。

你可能感兴趣的:(BLE中OSAL的运行机理怎么理解?)