简要分析zstack任务处理机制.pptxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Z-STACK协议栈任务调度;ZigBee 是一种低速短距离传输的无线网络协议,这一名称(又称紫蜂协议)来源于蜜蜂的八字舞。蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络,ZigBee 协议因此而得名。 Z-Stack 意为实现了ZigBee协议的栈,简称协议栈。我们的平台是基于 TI 的ZStack-CC2530-2.5.1a。这是一个半开源协议栈,其安全子模块,路由模块等关键代码都以库的方式封装,看不到也没办法修改。一般只需要利用底层代码在应用层进行编写即可。这种协议栈稳定性高,成本低,适用于工程人员使用。;一个Z-Stack工程文件大约有10万行代码。面对这么多文件,读者首先要理清楚他们的组织结构和主要功能,因此Z-Stack采用了分层结构:;这里要特别注意 Z-Stack 与 OSAL 的关系: ZigBee 网络协议需要依靠 Z-Stack 协议栈实现,而协议栈需要配合 OSAL 才能运行。OSAL 为协议栈实现了任务调度,并提供了多任务处理机制。OSAL类似于操作系统。 OSAL 采用事件轮询机制,各层初始化之后,系统进入低功耗模式,当事件发生时,系统被唤醒,开始进入中断处理事件,事件结束后继续进入低功耗模式。如果同时有几个事件发生,则判断优先级,按次序处理事件。这种软件架构极大降低了系统的功耗。;协议栈中一层有一个任务task,用8位的taskID表示,在osalInitTasks()给各层分配了taskID,按优先级排列。;tasksEvents,任务事件,tasksEvents[idx]通过idx提取该层的所有事件。 ;const pTaskEventHandlerFn tasksArr[] = { macEventLoop, nwk_event_loop, Hal_ProcessEvent, ....... SerialApp_ProcessEvent }; pTaskEventHandlerFn 从类型和翻译就可以知道这是一个指向任务事件处理函数的指针, 跳转到SerialApp_ProcessEvent, 存放了一个系统事件和用户自定义的事件。 结论: tasksArr是一个数组,数组里边是指针,指针指向各种任务事件处理函数。 每个函数的参数都是( uint8 task_id, UINT16 events ),每个函数的返回值都是UINT16;uint16 *tasksEvents tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);//动态分配地址 do { if (tasksEvents[idx]) // 高优先级(idx小)的任务做好准备 { break;//有任务则跳出循环 } } while (++idx tasksCnt); tasksEvents是一个指针, 这是指针,但是当数组来用了 数组的每个元素都对应idx层的所有事件,事件是16位的。 ;z-stack为什么是多任务?怎么判断优先级。 协议栈中整个组网过程是很复杂的,需要z-stack协议咋中各层相互配合,协议咋中就分配了很多任务,TI在代码中给各层分配了taskID,在使用osal操作系统执行任务时,根据taskID来判读各层的优先级,taskID越小优先级越高,所以当协议栈全速运行时,先执行的是mac层的任务. ;各层任务中又包含16位的事件,各层中的事件也是有优先级的,我们根据应用层的事件来分析,应用层中的事件除去一个系统事件外,还可以设置15个事件,一个事件只能占16位中的其中一位(某一位置1),系统事件的优先级最高0x8000,在应用层中都是先处理系统事件,设置的事件1的位置越靠左,优先级越高, 多任务处理机制? 实际上协议栈中的任务都是优先级一个一个进行处理,只不过处理每个任务花费的时间很短,看上去就像多个任务同时进行处理一样。 ;在osal_run_system()函数下对任务进行分配 当产生事件以后tasksEvents[idx]不为0. 找到事件处理的代码,关键分析以下几行: events = tasksEvents[idx]; 提取需要处理的任务事件,在这里给events赋值。 events = (tasksArr[idx])( idx, events ); 通过指针调用处理函数,处理结束一个事件异或清零。 tasksEvents[idx] |= events; 通过按位或操作,添加未处理的任务事件到任务事件数组。;温湿度代码来体现任务处理机制;事件的处理 应用层的事件处理

文档评论(0)

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

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

1亿VIP精品文档

相关文档