首页 理论教育 操作系统表象层(OSAL)的运行机理

操作系统表象层(OSAL)的运行机理

时间:2023-06-29 理论教育 版权反馈
【摘要】:ZigBee协议栈包含了ZigBee协议所规定的基本功能,这些功能是以函数的形式实现的,为了便于管理这些函数集,从ZigBee 2006协议栈开始,ZigBee协议栈内加入了实时操作系统,称为OSAL。从上面的分析可以得出下面的结论:OSAL就是一种支持多任务运行的系统资源分配机制。OSAL与标准的操作系统还是有一定区别的,OSAL实现了类似操作系统的某些功能,例如:任务切换、提供了内存管理功能等,但OSAL并不能称为真正意义上的操作系统。

操作系统表象层(OSAL)的运行机理

ZigBee协议栈包含了ZigBee协议所规定的基本功能,这些功能是以函数的形式实现的,为了便于管理这些函数集,从ZigBee 2006协议栈开始,ZigBee协议栈内加入了实时操作系统,称为OSAL(Operating System Abstraction Layer,操作系统抽象层)。非计算机专业的读者对操作系统知识较为欠缺,但是ZigBee协议栈里内嵌的操作系统很简单,读者只需要做个几个小实验,就能很快掌握整个OSAL的工作原理。

OSAL(Operating System Abstraction Layer),即操作系统抽象层,如何理解OSAL呢,从字面意思看是跟操作系统有关,但是后面为什么又加上“抽象层”呢,在 ZigBee协议栈中,OSAL有什么作用呢?下面将对上述问题进行讨论。

从之前对ZigBee协议栈的学习可以看出应用程序框架中包含了最多240个应用程序对象,每个应用程序对象运行在不同的端口上,因此,端口的作用是用来区分不同的应用程序对象。可以把一个应用程序对象看作一个任务,因此,需要一个机制来实现任务的切换、同步与互斥,这就是OSAL产生的根源。

从上面的分析可以得出下面的结论:OSAL就是一种支持多任务运行的系统资源分配机制。

OSAL与标准的操作系统还是有一定区别的,OSAL实现了类似操作系统的某些功能,例如:任务切换、提供了内存管理功能等,但OSAL并不能称为真正意义上的操作系统。

通常我们打开一个ZigBee的工程文件,在左侧可以看到三个文件,分别是“Coordinator.c”“Coordinator.h”“OSAL_GenericApp.c”。整个程序所实现的功能都包含在这三个文件当中。

首先打开Coordinator.c 文件,可以看到两个比较重要的函数GenericApp_Init 和GenericApp_ProcessEvent。GenericApp_Init是任务的初始化函数,GenericApp_ProcessEvent 则负责处理传递给此任务的事件。GenericApp_ProcessEvent函数的主要功能是判断由参数传递的事件类型,然后执行相应的事件处理函数。

因此,在ZigBee协议栈中,OSAL负责调度各个任务的运行,如果有事件发生了,则会调用相应的事件处理函数进行处理,OSAL的工作原理示意图如图10-1所示。

图10-1 OSAL的工作原理图

那么,事件和任务的事件处理函数是如何联系起来的呢?

ZigBee中采用的方法是:建立一个事件表,保存各个任务的对应事件,建立另一个函数表,保存各个任务事件处理函数的地址,然后为这两张表建立某种对应关系,当某一事件发生时则查找函数表,找到对应的事件处理函数即可。

现在问题转变为:用什么样的数据结构来实现事件表和函数表呢?如何为事件表和函数表建立对应关系呢?可以说,只要将上述两个问题解决,在整个协议栈的开发将会变得很容易。(www.xing528.com)

在ZigBee协议栈中,有三个变量至关重要。

taskCnt:该变量保存了任务的总个数,该变量的声明为unit8 tasksCnt,其中unit8的定义为typedef unsigned char uint8。

taskEvents:这是一个指针,指向事件表首地址的指针,该变量的声明为uint16*tasksEvents,其中unit16的定义为typedef unsigned short uint16。

taskArr:这是一个数组,该数组的每一项事件处理函数数组都是一个函数指针,指向事件处理函数。

该数组的声明为:

pTaskEventHandlerFn taskArr[]

其中pTaskEventHandlerFn的定义(需要特别注意)如下:

Typedef unsigned short(*pTaskEventHandlerFn)(unsigned char task_id,unsigned short event)

这是定义了一个函数指针。

因此,tasksArr数组的每一项都是一个函数指针,指向了事件处理函数。

这里我们总结一下OSAL的工作原理:通过taskEvents指针访问事件表的每一项,如果有事件发生,则查找函数表找到事件处理函数进行处理,处理完毕后,继续访问事件表,查看是否有事件发生,如此无限循环。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈