- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ZigbeeOSAL系统框架专题
9.TI协议栈所用系统框架探讨。
51的系统往往不是太大,但是几十K的程序,也足以让一个初学者望而却步。我们首先忽
略C语言本身的难度,光是系统框架也让生手读起来很吃力,再加上这种到处是API跟
define的程序,还没有正式学习协议部分就已经让人在丛林中“迷路”了。
在接下来的一段时间内,我会以TI所用的系统框架为主线进行学习,希望大家共同探讨。。。
[注:本文源自--“飞比”Zigbee论坛,为尊重劳动者成果,如需转载请保
留此行]
在层层迷雾中摸索了两天,终于拨云见日,那个心情啊,怎一个“爽”字了得~~~
可是怎么能把这么复杂的一个问题讲得清楚呢?嗯。。。还是先上图吧
注:为了便于直观,以下涉及到数据地址的地方都是由上而下,地址由高变低
第1节、各个任务是如何被调用到的?
我们还是先从main()函数开始,看看各个任务之间是如何协调工作的。
插播一句广告:在一切都看不清的时候,忽略次要,看主要因素-- byoutmanfrom
我们直接进入主循环的核心部分,看一下系统中的几个主要的任务是如何被调用,并开始自
己的使命的?
看一段程序的时候,往往要从它的数据结构入手。我们先看一下,主循环中的两个关键数组,
*tasksEvents与*tasksArr,从图一中我们可以看出来,tasksEvents这个数组存放的是从
序号为0到tasksCnt,每个任务在本次循环中是否要被运行,需要运行的任务其值非0(用
橙色表示),否则为0。而tasksArr数组则存放了对应每个任务的入口地址,只有在
tasksEvents中记录的需要运行的任务,在本次循环中才会被调用到。--这节讲完了。。。
又有同学举手?什么?还没明白?恩。。。好像是不能讲这么短的。。。
那好吧,把main函数贴过来,我们一点一点看
初始化过程“先不管”,我们先看主循环(deadloop)
for(;;) //ForeverLoop
{
uint8idx=0;
Hal_ProcessPoll(); //先不管1
do{
if(tasksEvents[idx]) // 寻找最高优先级的任务来运行
{
break;
}
}while(++idxtasksCnt);
if (idx tasksCnt)//如果有任务需要运行
{
uint16events;
halIntState_tintState;
HAL_ENTER_CRITICAL_SECTION(intState);
events=tasksEvents[idx];
tasksEvents[idx]=0; //本任务运行完了,要对其清空,为后面要运行的任务让
路
HAL_EXIT_CRITICAL_SECTION(intState);
events=(tasksArr[idx])(idx,events);//最关键的一句话,如图一中,运行对
应的任务
HAL_ENTER_CRITICAL_SECTION(intState);
tasksEvents[idx]|=events; //本任务可能没完全完成,如果是这样,再次设置
标志位,在下一次循环中继续执行
HAL_EXIT_CRITICAL_SECTION(intState);
}
}
第2节、系统时间
我们知道,每个操作系统(虽然我不认为OSAL是一个标准的操作系统,但我们先这么叫着
吧)都有一个“节拍”-tick,就像每一个“活人”都有心跳一样。那么OSAL的心跳有多
快呢?--1ms。当然这个速度是可以设置的,在osal_timer_activate函数中开启了系统
节拍,用TICK_TIME来定义其速度
#defineTICK_TIME 1000 //Timerpertick-inmicro-sec
注意:这个1000是micro-sec(微秒),而不是milli-sec(毫秒)!我刚开始的时候就
是误以为是1000ms而耽误了不少时间。
那这个心脏是怎么跳动起来的呢?
这得从“定时器”说起,由于本文的重点不是讲单片机基础的,如果对这个名字还陌生的同
学,那还是回去先看看基础再来看这个吧。2430有4个定时/计数器,其中timer4用来做
系统计时。如果认为是timer2的同学请看一下halTimerRemap这个函数。在上述
osal_timer_activate函数中,开启了系统计时,并将ti
您可能关注的文档
最近下载
- 迈富时 上市招股说明书.pdf VIP
- 年产3500吨对羟基苯甲酸乙酯(食品添加剂)项目可行性研究报告.docx VIP
- HMMT_-_哈佛-MIT数学竞赛题.pdf
- 资金平衡表.doc VIP
- 小学生四年级上册暑假练字电子字帖生字写字表提前学习练习楷书字帖pdf可打印文件.pdf VIP
- 氢氟酸安全标签.doc VIP
- 2025年全国统一高考生物试卷(江西卷)含答案 .pdf VIP
- 《义务教育数学课程标准(2022年版)》【试题】题库及答案汇总.docx VIP
- 八年级上册历史《中华民族的抗日战争》单元作业设计 (优质案例50页) .pdf VIP
- 商务日语函电第2课 支払い遅延の依頼と回答.ppt VIP
文档评论(0)