[计算机]理解ucosii.docVIP

  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文档。上传文档
查看更多
[计算机]理解ucosii

3.00 临界段,OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() 3种方法实现上边两个函数:(1) OS_CRITICAL_METHOD==1,用关中断实现OS_ENTER_CRITICAL,用开中断实现OS_EXIT_CRITLCAL();此方法的缺点是如果进入该函数前系统的中断状态是关中断,调用函数后则会改变其中断状态。(2)OS_CRITICAL_METHOD==2, 用在堆栈中保存现在的中断开关状态,然后关中断来实现OS_ENTER_CRITICAL,用从堆栈中弹出原来的中断状态来实现OS_EXIT_CRITICAL();此方法存在的问题是:有些编译器不够灵敏,不能正确进行出入栈操作而引起严重错误。(3)OS_CRITICAL_METHOD==3,用户可以得到当前处理器的状态字值,并保存在一个C函数的局部变量里,这个变量可以用于恢复PSW。 3.01 任务? Ucosii 最多管理64个任务,但有些被系统保留,所以推荐使用其中的56个,不用前4个和后4个;为了使ucosii管理用户任务,必须在建立任务时,将任务的起始地址与其他参数传递给OSTaskCreate()或OSTaskCreateExt()中的一个。 3.02任务状态? (睡眠态、就绪态、运行态、中断服务态、等待态) 当所有任务都在等待事件的发生或等待延迟时间的结束时,ucosii执行空闲任务OSTaskIdle(). 3.03任务控制块(OS_TCB) 一旦任务建立,一个任务控制块OS_TCB就被赋值,任务控制块是一个数据结构,当任务的CPU使用权被剥夺时,任务控制块用来保存该任务的状态,当任务重新得到CPU的使用权时,任务控制块能确保任务从当时被中断的那一点继续执行。OS_TCB全部驻留在RAM中。 3.04就绪表 每个就绪的任务都放在就绪表(ready list)中,就绪表中有两个变量:OSRdyGrp和OSRdyTbl[].?? 找出进入就绪态的优先级最高的任务的办法(ucosii提供了一个表OSUnMapTbl[]): y = OSUnMapTbl[OSRdyGrp];? x = OSUnMapTbl[OSRdyTbl[y]];? prio = (y3) + x ; 附:若从就绪表的两个变量,通过查找法或直观地看,也可以找到处于就绪态的优先级最高的任务,但是比较麻烦,ucosii加入了算法,通过查表的办法可以直接得到处于就绪态的优先级最高的任务,比较方便。 ? 3.05任务调度? Ucosii总是运行进入就绪态任务中优先级最高的任务。确定哪个任务优先级最高由调度器(SCHEDULER)完成。任务级调度由函数OSSched()完成;中断级调度由另一个函数OSIntExt()完成;? OSShed()的所有代码都属于临界代码,为防止寻找就绪态优先级最高的任务时中断服务程序把一个或几个任务的就绪位置位,中断是关掉的。 3.06任务级的任务切换 OS_TASK_SW() 任务切换很简单: 将被挂起任务的处理器寄存器推入堆栈,然后将较高优先级任务的寄存器值从栈中恢复到寄存器中。 3.07给调度器上锁和开锁 OSSchedlock()用于禁止任务调度;OSSchedUnlock() 开锁 ;两个函数必须成对使用。 变量OSLockNesting跟踪OSSchedLock()函数被调用的次数,以允许嵌套的函数包含临界段代码,这段代码其他任务不得干预。Ucosii允许嵌套深度达255层,当OSLockNesting==0时,调度重新得到允许。?? 调用了OSSchedLock()后,用户程序不得调用可能使当前任务挂起的系统功能函数,若调用了系统会被锁住。 3.08空闲任务 OSTaskIdle()? 其永远被设为最低优先级OS_LOWEST_PRIO,且不能被应用软件删除。 空闲任务是永远处于就绪态的,故不要在OSTaskIdleHook()中调用任何可以使任务挂起的PEND函数. 3.09统计任务OSTaskStat() 若将OS_TASK_STAT_EN设为1,这个任务就会建立。一旦得到了允许,OSTaskStat()就会每秒运行1次,计算当前CPU的利用率,将计算的值放在一个有符号8位整数OSCPUsage中,精确度为1%。 若打算使用统计任务,必须在初始化时建立的第一个也是唯一的任务中调用统计任务的初始化函数OSStatInit();换句话说,在调用系统启动函数OSStart()之前,用户初始化代码中必须建立一个任务,在这个任务中调用系统统计初始化函数OSStatInit(),然后再建立应用程序中的其他任务。 3.10? ucosii中的中断 ?进入中断函数: OSIntEnter()???? 从中断服务中退出函

文档评论(0)

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

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

1亿VIP精品文档

相关文档