传感网应用开发(高级)课件4.2-Z-Stack-OSAL运行机制

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Z-StackOSAL运行机制任务与事件的添加基于协议栈的串口通信01重点与难点02原理介绍03目录CONTENTS串口通信案例重点与难点重点:1、OSAL的运行机制;2、任务、事件、事件处理函数的概念。难点:1、事件响应机制;2、添加任务、事件的实现。2.1OSAL术语及概念Z-Stack采用基于一个轮转查询式操作系统,该操作系统命名为OSAL(OperatingSystemAbstractionLayer),中文为“操作系统抽象层”。Z-Stack协议栈将底层、网络层等复杂部分屏蔽掉,让程序员通过API函数就可以轻松地开发一套ZigBee系统。原理介绍任务(Task)任务又称线程,是一个简单的程序的执行过程。在任务设计时,需要将问题尽可能地分为多个任务,每个任务独立完成某种功能,同时被赋予一定的优先级,拥有自己的CPU寄存器和堆栈空间资源。一般将任务设计为一个无限循环。事件(Events)ZigBee协议栈是由各个层组成的,每一层都要处理各种事件,所以就为每一层定义了一个事件处理函数,可以把这个处理函数理解为任务,任务从消息队列中提取消息,从消息中提取所发生的具体事件,调用相应的具体事件处理函数,比如按键处理函数等等。原理介绍2.2OSAL运行机制OSAL就是以实现多任务为核心的系统资源分配机制,主要提供任务注册、初始化和启动,任务间的同步、互斥,中断处理,存储器分配与管理等功能。OSAL负责调度各个任务运行,如果有事件发生时,则会调用相应的事件处理函数进行处理。图1OSAL运行机制原理介绍事件和任务的事件处理函数是如何建立关系:首先,建立一个事件表,保存各个任务的对应的事件;其次,建立一个函数表,保存各个任务事件处理函数的地址;最后,将这两个表建立某种对应关系,当某一事件发生时,则查找函数表找到对应的事件处理函数。原理介绍tasksArr[2]tasksArr[1]tasksArr[0]tasksArr[tasksCnt]tasksEvents[tasksCnt]tasksArr[]函数表tasksEvents[0]tasksEvents[1]tasksEvents[2]SampleApp_ProcessEventmacEventLoopNwk_event_loopHal_ProcessEvent事件表......tasksEvents图2事件表和函数表的关系■通过不断地查询事件表(tasksEvents[idx]),判断是否有事件发生,如果有则查找函数表(tasksArr[idx]),调用本事件的处理函数。■事件表是用数组来表示,数组的每个元素对应用一个任务的事件,一般用户定义的事件最好是每一位二进制数表示一个事件,那么一个任务最多可以有16个事件(因为events是uint16类型)。例如:0x01表示串口接收新数据,0x02表示读取温度数据,0x04表示读取湿度数据等,但是不用0x03、0xFE等数值表示事件。■函数表是用指针数组来表示,数组的每个元素是相应任务的事件处理函数的首地址(函数指针)。OSAL是一种基于事件驱动的任务轮询式操作系统,事件有效才调用相应任务的事件处理函数。原理介绍2.3关键函数在ZigBee协议栈中,tasksCnt、tasksEvents和tasksArr三个变量非常重要:tasksCnt:该变量保存了任务的总数量。tasksEvent:这是一个指针,指向了事件表的首地址。在OSAL_SampleApp.c中声明为:uint16*tasksEvents;tasksArr:这是一个数组,该数组的每个元素都是一个函数指针(函数的地址),指向了事件函数。原理介绍2.4添加任务与事件的方法在ZigBee协议栈应用程序开发时,添加新的任务及其对应的事件,方法如下:■在任务的函数表中添加新任务。■编写新任务的初始化函数。■定义新任务全局变量和事件。■编写新任务的事件处理函数。原理介绍3.1案例介绍在用户应用层任务处理函数SampleApp_ProcessEvent中实现每隔1秒向串口发送“HelloZigBee!”;并增加一个应用层新任务,实现由PC端发送字符“1”和“0”控制ZigBee模块的LED2灯的开与关。实训案例1、移除工程中的SampleAppHw.h和SampleAppHw.c文件。修改SampleApp.c文件对头文件的引用(注意Workspace选择CoordinatorEB)。实训案例2、打开MT_UART.h,关闭串口流控,将波特率改为115200。实训案例3、修改SampleApp.h,增加周期时长和串口事件编号的宏定义。实训案例4、SampleApp.c中修改SampleApp_Init函数,启动一个1秒定时器,向SampleApp_TaskID发送串口定时发送事件。实训案例实训案例5、修改SampleApp_ProcessEvent函数。增加新事件SAMPLEAPP_SEND_PERIODIC_UART_MSG_EVT的处理,先向串口输出“HelloZigBee”信息,再启动1秒定时器。实训案例6、添加应用层新任务。(1)创建UartApp.h头文件,并在该文件中增加任务初始化函数和事件处理函数声明。实训案例(2)创建UartApp.c文件,并在该文件中增加新任务的初始化函数和事件处理函数(重要)。实训案例(3)打开OSAL_SampleApp.c文件,在任务数组constpTaskEventHandleFntasksArr[]中增加应用层任务处理函数UartApp_ProcessEvent,保证新任务事件处理函数得到调度。实训案例(5)在OSAL_SampleAPP.c中添加头文件UartApp.h的引用。实训案例实训案例思考与作业:(1)通过串口发送非1数字(如6),灯会被点亮吗?(2)发送1后,如何将灯从常亮改为闪烁?

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功