- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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;
通过按位或操作,添加未处理的任务事件到任务事件数组。;温湿度代码来体现任务处理机制;事件的处理
应用层的事件处理
您可能关注的文档
最近下载
- 糖尿病健康宣教.pptx VIP
- 22G101-1混凝土结构施工图平面整体表示方法制图规则和构造详图(现浇混凝土框架、剪力墙、梁、板)(OCR).pdf VIP
- 体育旅游与户外运动.ppt VIP
- 2024凉山州专业技术人员继续教育公需科目-发挥平台企业引领作用,促进数字经济加快发展试题及满分答案.docx VIP
- 公司科技发展战略规划.pdf VIP
- 音乐小酒馆创业计划书.pptx VIP
- 1.1.1认识“几个几”相加(课件)2025-2026学年度苏教版数学二年级上册.pptx VIP
- 建设项目工程施工劳动力计划安排及保证措施、方案.docx VIP
- DB62 692-2001 电石(碳化钙)运输组合包装袋.docx VIP
- (2025)保安员资格考试题库(含答案).pdf
文档评论(0)