ZigBee协议栈OSAL运行机理研究与测试.docVIP

ZigBee协议栈OSAL运行机理研究与测试.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ZigBee协议栈OSAL运行机理研究与测试

ZigBee协议栈OSAL运行机理研究与测试   摘 要:文中研究分析了ZigBee协议栈的OSAL运行机理,并在此基础之上,通过规范的编程流程,设计了一个行之有效的测试系统,很好地演示了OSAL如何??现多任务切换和处理机制,对后期基于协议栈的编程提供了技术支持。   关键词:ZigBee协议栈;OSAL;任务事件;技术支持   中图分类号:TP39;TN92 文献标识码:A 文章编号:2095-1302(2017)08-00-02   0 引 言   从ZigBee 2006协议栈开始,ZigBee协议栈内加入了实时操作系统,主要制定了一个实现任务间切换、同步与互斥等的机制,而这就是操作系统表象层OSAL (Operating System Abstraction Layer,OSAL)产生的根源。OSAL与标准的操作系统存在一定区别,它只实现了类似操作系统的某些功能,如任务切换、内存管理等,还不能称为真正意义上的操作系统[1]。OSAL专门分配了存放所有任务事件的tasksEvents[]数组,每一个单元对应存放着每一个任务的所有事件,在这个函数中首先通过一个do―while循环来遍历tasksEvents[],找到一个具有待处理事件的优先级最高的任务,序号低的任务优先级高,然后跳出循环,此时,就得到了最高优先级任务的序号idx,然后通过events=tasksEvents[idx]语句将当前具有最高优先级的任务事件取出,接着调用(tasksArr[idx])(inx,events)函数来执行具体的处理。taskArr[]是一个函数指针数组,根据不同的idx可以执行不同的函数[2],其程序流程图如图1所示。   打开一个ZigBee工程文件,在左侧通常可以看到三个文件,分别为“Coordinator.c”、“Coordinator.h”、“OSAL_GenericApp.c”。整个程序所实现的功能都包含在这三个文件中。首先打开Coordinator.c 文件,可以看到两个比较重要的函数GenericApp_Init 和 GenericApp_ProcessEvent。GenericApp_Init是任务的初始化函数,GenericApp_ProcessEvent则负责判断由参数传递的事件类型,然后执行相应的事件处理函数[3]。我们的设计同样需要遵循该流程,既要进行任务初始化也需要完成开中断执行操作系统实体的功能。可以将该工作细化为初始化工作、事件的设置和响应、编写任务事件处理函数。本文设计了一个验证该运行机理的演示代码,展示了不同优先级的任务是如何按先后顺序被初始化及跳转到相应的任务事件处理函数来执行的效果。   1 初始化工作   在Zmain.c中首先应启动系统,即需要完成初始化功能,包括硬件平台和软件架构所需的各个模块,为操作系统的运行做好准备。由于大部分初始化工作协议栈已设置好,此处我们只需特别设置的初始化工作包括初始化工作时钟、初始化串口、初始化定时器、设置串口、使能中断等,同时用户自定义的事件也都需要放到任务初始化函数中进行初始化,此过程分为两步:   (1)将所有任务对应的事件表清空,任务事件表保存在TaskEvents结构当中,该结构是一个uint16类型的数组,数组的每一个元素对应一个任务所有的事件,16位对应了16个事件。其中最高位表示是否为系统事件,最高位为1,则表示为系统事件;最高位为0,则表示为非系统事件。   (2)为每个任务分配任务ID并初始化具体任务,任务ID决定了任务的优先级,ID越小响应的优先级越高,在任务初始化函数中,最新初始化的任务ID最小,优先级最高,ID依次递增,最小ID为0,最大ID为TaskCont-1。其具体代码如下:   void OS_IntTasks( void )   {   uint8 i,taskId = 0;   for( i = 0; i < TaskCont; i ++ )   {   TaskEvents[i] = 0;   }   testOsInt( taskId++ ); //增加任务初始化,确定任务ID   }   倘若需要增加更多任务,只需在testOsInt( taskId++ )注册新任务即可。   2 事件的设置和响应   任务事件的设置有两种方式[4]:一种直接使用uint8osal_set_event( uint8 task_id, uint16 event_flag )函数来设置事件,该函数包含了两个参数,即任务ID和事件标志;另一种方法是设置一个超时事件。设置超时事件与直接设置事件的区别在于,超时事件不会立刻将事件加入到相应任务的事件列表中,而是需要等待一定时间后才会加入,这个事件是

您可能关注的文档

文档评论(0)

fangsheke66 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档