简要分析z-stack的任务处理机制_第1页
简要分析z-stack的任务处理机制_第2页
简要分析z-stack的任务处理机制_第3页
简要分析z-stack的任务处理机制_第4页
简要分析z-stack的任务处理机制_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Z-STACK协议栈任务调度以温湿度传感器代码为例讲解ZigBee 是一种低速短距离传输的无线网络协议,这一名称(又称紫蜂协议)来源于蜜蜂的八字舞。蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络,ZigBee 协议因此而得名。Z-Stack 意为实现了ZigBee协议的栈,简称协议栈。我们的平台是基于 TI 的ZStack-CC2530-2.5.1a。这是一个半开源协议栈,其安全子模块,路由模块等关键代码都以库的方式封装,看不到也没办法修改。一般只需要利用底层代码在应用层进行编写即可。这种协议栈稳定性

2、高,成本低,适用于工程人员使用。一个Z-Stack工程文件大约有10万行代码。面对这么多文件,读者首先要理清楚他们的组织结构和主要功能,因此Z-Stack采用了分层结构:这里要特别注意 Z-Stack 与 OSAL 的关系:ZigBee 网络协议需要依靠 Z-Stack 协议栈实现,而协议栈需要配合 OSAL 才能运行。OSAL 为协议栈实现了任务调度,并提供了多任务处理机制。OSAL类似于操作系统。OSAL 采用事件轮询机制,各层初始化之后,系统进入低功耗模式,当事件发生时,系统被唤醒,开始进入中断处理事件,事件结束后继续进入低功耗模式。如果同时有几个事件发生,则判断优先级,按次序处理事件。

3、这种软件架构极大降低了系统的功耗。协议栈中一层有一个任务task,用8位的taskID表示,在osalInitTasks()给各层分配了taskID,按优先级排列。在各层的任务中又包含若干个事件,事件用16位的event表示,任何一个事件只占16位中的一位(0 x0001为一个事件,0 x0010为一个事件),所以任何一层最多只有16个事件。APP层中有一个系统事件0 x8000,为该层优先级最高的事件。taskcan,cnt 是count(总数)的简写,这个变量从名字就可以看出表示的是任务的数量。 tasksArr 意思是任务数组,它的原型是pTaskEventHandlerFntasksA

4、rr ,协议栈分层每层有一个任务,每层都有一个事件处理函数来处理任务,各层处理函数都放在了数组tsksArr中,只不过是以指针的方式存在数组tasksArr 中。任务和事件,三个和task相关的重要数据rtasksEvents,任务事件,tasksEventsidx通过idx提取该层的所有事件。const uint8 tasksCnt = sizeof( tasksArr ) / sizeof( tasksArr0 );/计算任务个数const pTaskEventHandlerFn tasksArr = macEventLoop, nwk_event_loop, Hal_ProcessEve

5、nt,. SerialApp_ProcessEvent;pTaskEventHandlerFn 从类型和翻译就可以知道这是一个指向任务事件处理函数的指针,跳转到SerialApp_ProcessEvent,存放了一个系统事件和用户自定义的事件。结论: tasksArr是一个数组,数组里边是指针,指针指向各种任务事件处理函数。每个函数的参数都是( uint8 task_id, UINT16 events ),每个函数的返回值都是UINT16数组taskArruint16 *tasksEventstasksEvents = (uint16 *)osal_mem_alloc( sizeof( uin

6、t16 ) * tasksCnt);/动态分配地址do if (tasksEventsidx) / 高优先级(idx小)的任务做好准备 break;/有任务则跳出循环 while (+idx tasksCnt);tasksEvents是一个指针,这是指针,但是当数组来用了数组的每个元素都对应idx层的所有事件,事件是16位的。数组taskEventsz-stack为什么是多任务?怎么判断优先级。协议栈中整个组网过程是很复杂的,需要z-stack协议咋中各层相互配合,协议咋中就分配了很多任务,TI在代码中给各层分配了taskID,在使用osal操作系统执行任务时,根据taskID来判读各层的优先

7、级,taskID越小优先级越高,所以当协议栈全速运行时,先执行的是mac层的任务.各层任务中又包含16位的事件,各层中的事件也是有优先级的,我们根据应用层的事件来分析,应用层中的事件除去一个系统事件外,还可以设置15个事件,一个事件只能占16位中的其中一位(某一位置1),系统事件的优先级最高0 x8000,在应用层中都是先处理系统事件,设置的事件1的位置越靠左,优先级越高,多任务处理机制?实际上协议栈中的任务都是优先级一个一个进行处理,只不过处理每个任务花费的时间很短,看上去就像多个任务同时进行处理一样。在osal_run_system()函数下对任务进行分配当产生事件以后tasksEvent

8、sidx不为不为0.找到事件处理的代码,关键分析以下几行: events = tasksEventsidx;提取需要处理的任务事件,在这里给events赋值。 events = (tasksArridx)( idx, events );通过指针调用处理函数,处理结束一个事件异或清零。 tasksEventsidx |= events;通过按位或操作,添加未处理的任务事件到任务事件数组。温湿度代码来体现任务处理机制事件的产生osal_set_event( uint8 task_id, uint16 event_flag )顾名思义,这个函数就是设置事件。被传入的事件通过一个“或操作”来写入任务的

9、事件变量。task_id是接收的任务ID,event_flag是被设置的事件。除了上面的osal_set_event()可以设置事件,还有一个函数也可以设置事件,而且可以通过定时器指定事件的时间:uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )这里应用了定时器,task_id是接收的任务ID,event_id是被设置的事件,而uint16 timeout_value 则是事件启动的周期,如果设置为5000就是在5000毫秒后启动这个事件。事件的处理 应用层的事件处理也是按优先级来进行的

10、,1的位置越靠左优先级越高。优先级最高的为系统事件0 x8000,系统事件中又使用switchcase :语句分成三小部分,如果设备加入,或组建网络都是先执行系统事件中的ZDO_START_CHANGE上图所示是用户自己设定的温湿度读取事件,周期事件,发送事件,优先级温室度读取事件较高,在tempandhum.c中seriaAPP_processEvent()函数下能找到其对应的事件。处理完一个事件后异或清零。异或操作的知识按位的异或,相同为“0”,不同为“1”。异或操作的作用及思路在osal_run_system()函数中有 events=tasksEventsidx;这样一串代码,运行到应

11、用层时,idx的值为8,就把应用层的所有事件赋给了16位的events,以温湿度代码为例:初始值events的值就为 系统事件、温湿度读取事件、发送消息事件、及周期事件的或操作。events就为1000 0000 0000 0111,if ( events & SYS_EVENT_MSG )只要表达式不为零成立,就执行。通过按位&与操作先把系统事件0 x8000提取出来,通过 return ( events SYS_EVENT_MSG )异或之后events的值就为0000 0000 0000 0111作为返回值, 异或之后的代码不执行,只有在下次循环时才会执行到。osal_run_system() 函数下先是把tasksEventsidx =0;清零然后再通过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论