理论教育 物联网开发与应用实践OSAL系统的使用与应用

物联网开发与应用实践OSAL系统的使用与应用

时间:2023-10-27 理论教育 版权反馈
【摘要】:应用初始化的主要目的是分配给每个应用一个独有的id,以便OSAL系统对其进行区分和调用,各应用的初始化函数的主要工作也是将分配得到的id保存在全局变量中,以便消息处理等其他函数使用。提供对应的消息处理函数OSAL系统在收到消息后要调用对应应用的消息处理函数,因此需要将气象监测应用的消息处理函数地址提供给系统。

物联网开发与应用实践OSAL系统的使用与应用

1.OSAL分析与使用

整个ZStack协议栈在经过了初始化后,就进入了OSAL系统的运行之中。在ZigBee协议中,并没有对应的操作系统相关的协议层,但在应用层有多个应用。因此TI公司就设计了OSAL这个简易的系统,用于管理整个系统中的多应用环境,整个操作系统的源代码位于工程中的OSAL文件夹下。OSAL系统将所有的任务都当做应用来管理,包括协议的网络层、MAC层实现,都是OSAL中的一个系统应用。对于多应用的运行和管理,OSAL采取的策略为消息驱动、轮询检测方式。

每个应用的执行流程都在其提供给OSAL的消息处理函数里完成,此函数由OSAL在发生了网络、硬件操作事件后自动调用,并将对应的消息作为参数传递进来。每个应用的消息处理函数检测消息的类型,根据不同的事件(消息),采取对应的处理,完成后返回,继续等待下一个消息。因此应用的执行都是在获取消息、处理消息的循环中完成的。本设计中用到的消息有:

(1)ZDO_STATE_CHANGE

设备网络状态改变消息。当协调器节点建立网络成功,路由器节点、终端节点加入网络成功,或者节点从网络中退出时,都会收到此消息。

(2)AF_INCOMING_MSG_CMD

网络数据接收消息。当节点已经加入网络后,如果接到其他节点发送的消息,则处理函数会接收到此消息。同时此消息中还包含有接收到的具体数据、发送源节点网络地址信息等。

(3)AF_DATA_CONFIRM_CMD

当节点上某应用执行了发送数据函数调用后,返回给该应用的消息,代表刚才的发送函数执行状态。如Zsuccess代表发送成功。

轮询监测指的是,在协议栈完成初始化、调用osal_start_system函数开始系统运行后,OSAL就一直处于一个无限循环的处理中。它从第一个应用开始,判断该应用是否有新的消息,没有则检查下一个;如果有,则调用该应用的消息处理函数,并将这个新的消息作为参数传递,处理函数执行完毕返回后,将此消息清除,继续检查下一个应用的状态。检查完所有应用后,OSAL进入短时间的一个休眠,休眠完后继续这个过程,从第一个应用开始检测。这里的新消息有多种可能的来源,如节点内某个应用向系统发出的消息,或者收到其他节点发来的网络数据。整个OSAL系统的运行流程图如图4-15所示。

978-7-111-44976-8-Chapter04-28.jpg

图4-15 OSAL逻辑流程图

2.自定义应用添加

在了解了OSAL的运行流程之后,可以开始添加自定义的应用。例如,在本系统设计中,将要添加的气象监测应用命名为WeatherApp。添加自定义应用的步骤如下:(www.daowen.com)

(1)提供对应的应用初始化函数

每个应用都必须提供一个初始化函数,并会被整个协议栈初始化过程中的操作系统初始化函数osal_init_system间接调用。应用初始化的主要目的是分配给每个应用一个独有的id,以便OSAL系统对其进行区分和调用,各应用的初始化函数的主要工作也是将分配得到的id保存在全局变量中,以便消息处理等其他函数使用。osal_init_system函数中会调用osalInitTasks函数,该函数代码如下所示:

978-7-111-44976-8-Chapter04-29.jpg

978-7-111-44976-8-Chapter04-30.jpg

该函数最后调用了自定义应用的初始化函数WeatherApp_Init()。其过程是从0开始,依次分配给系统应用和自定义应用一个递增的整型数作为应用id。

(2)提供对应的消息处理函数

OSAL系统在收到消息后要调用对应应用的消息处理函数,因此需要将气象监测应用的消息处理函数地址提供给系统。其方法是将函数地址加入系统里一个函数地址数组taskArr中,本设计中,其值为

978-7-111-44976-8-Chapter04-31.jpg

pTaskEventHandlerFn是系统已定义的一个函数指针类型,前5个值都是系统应用自身提供的处理函数,位于各文件夹里的实现文件中。需要注意的一点是,OSAL系统会把应用的id作为数组的索引,从而访问数组直接得到该应用的处理函数地址并调用,因此函数地址中各应用的顺序必须与应用id一致,也就是必须与osalInitTasks函数中调用应用初始化函数的顺序一致。

(3)向系统注册应用的endPoint

如前面介绍ZigBee协议时所说,每一个节点上都有可能运行多个不同的应用,为了区分发送给同一节点上不同应用的网络数据,ZigBee协议设计了EndPoint概念,不同的终端号代表了不同的应用,数据传输在一对网络地址加终端号间进行。本系统中WeatherApp应用需要收发网络数据,因此也需要对应的终端号,设计中选取了没有被系统应用占用的10。然后需要向OSAL系统注册,这样OSAL在接收到该终端号的数据时,会将AF_INCOMING_MSG_CMD消息告知WeatherApp应用的处理函数。注册是依靠系统提供的API函数afRegister(endPointDesc_t∗addr),其参数为一个表示终端号信息的数据结构的地址,该数据结构为

978-7-111-44976-8-Chapter04-32.jpg

endPoint,终端号,本应用中为10;task_id,指向的是存有应用id值(5)的一个byte结构;simpleDesc,指向简单描述符数据结构,该结构中存有气象监测应用初始化函数中添加的一些参数数据;latencyReq,延时参数,根据TI相关文档,必须填为一个enum变量no-LatencyReqs(值为0)。

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

我要反馈