uC/OS-II中优先级翻转问题

1 uc/os-ii的运行机制
在嵌入式系统的应用中,实时性是一个重要的指标,而优先级翻转是影响系统实时性的重要问题。本文着重分析优先级翻转问题的产生和影响,以及在uc/os-ii中的解决方案。
uc/os-ii采用基于固定优先级的占先式调度方式,是一个实时、多任务的操作系统。系统中的每个任务具有一个任务控制快os_tcb,任务控制块记录任务执行的环境,包括任务的优先级,任务的堆栈指针,任务的相关事件控制块指针等。内核将系统中处于就绪态的任务在就绪表(ready list)进行标注,通过就绪表中的两个变量osrdygrp和osrdytbl[]可快速查找系统中就绪的任务。在uc/os-ii中每个任务有唯一的优先级,因此任务的优先级也是任务的唯一编号(id),可以作为任务的唯一标识。内核可用控制块优先级表ostcbpriotbl[]由任务的优先级查到任务控制块的地址。uc/os-ii主要就是利用任务控制快os_tcb、就绪表(ready list)和控制块优先级表ostcbpriotbl[]来进行任务调度的。任务调度程序ossched()首先由就绪表(ready list)中找到当前系统中处于就绪态的优先级最高的任务,然后根据其优先级由控制块优先级表ostcbpriotbl[]取得相应任务控制块的地址,由os_task_sw()程序进行运行环境的切换。将当前运行环境切换成该任务的运行环境,则该任务由就绪态转为运行态。当这个任务运行完毕或因其它原因挂起时,任务调度程序ossched()再次到就绪表(ready list)中寻找当前系统中处于就绪态中优先级最高的任务,转而执行该任务,如此完成任务调度。若在任务运行时发生中断,则转向执行中断程序,执行完毕后不是简单的返回中断调用处,而是由osintexit()程序进行任务调度,执行当前系统中优先级最高的就绪态任务。当系统中所有任务都执行完毕时,任务调度程序ossched()就不断执行优先级最低的空闲任务ostaskidle(),等待用户程序的运行。
2 uc/os-ii中的优先级翻转问题
在uc/os-ii中,多个任务按照优先级高低由内核调度执行,而且任务调度所花的时间是常数,与应用程序中建立的任务数无关。对于占先式内核,任务的响应时间是确定的,而且是最优化的,占先式内核保证最高优先级的任务最先执行。
任务的响应时间=寻找最高优先级任务的时间+任务切换时间
在uc/os-ii中寻找进入就绪态的最高优先级任务是通过查就绪表实现的,这减少了所需时间。
y=osunmaptbl[osrdygrp];
x= osunmaptbl [osrdytbl[y]];
prio=(yc,任务a,b处于挂起状态,等待某一事件的发生,任务c正在运行,此时任务c开始使用某一共享资源s。在使用中,任务a等待的事件到来,任务a转为就绪态,因为它比任务c优先级高,所以立即执行。当任务a要使用共享资源s时,由于其正在被任务c使用,因此任务a被挂起,任务c开始运行。如果此时任务b等待的事件到来,则任务b转为就绪态。由于任务b的优先级比任务c高,因此任务b开始运行,直到其运行完毕,任务c才开始运行。直到任务c释放共享资源s后,任务a才得以执行。在这种情况下,优先级发生了翻转,任务b先于任务a运行。这样便不能保证高优先级任务的响应时间,解决优先级翻转问题有优先级天花板(priority ceiling)和优先级继承(priority inheritance)两种办法。
优先级天花板是当任务申请某资源时,把该任务的优先级提升到可访问这个资源的所有任务中的最高优先级,这个优先级称为该资源的优先级天花板。这种方法简单易行,不必进行复杂的判断,不管任务是否阻塞了高优先级任务的运行,只要任务访问共享资源都会提升任务的优先级。在uc/os-ii中,可以通过ostaskchangeprio()改变任务的优先级,但是改变任务的优先级是很花时间的。如果不发生优先级翻转而提升了任务的优先级,释放资源后又改回原优先级,则无形中浪费了许多cpu时间,也影响了系统的实时性。
优先级继承是当任务a申请共享资源s时,如果s正在被任务c使用,通过比较任务c与自身的优先级,如发现任务c的优先级小于自身的优先级,则将任务c的优先级提升到自身的优先级,任务c释放资源s后,再恢复任务c的原优先级。这种方法只在占有资源的低优先级任务阻塞了高优先级任务时才动态的改变任务的优先级,如果过程较复杂,则需要进行判断。uc/os-ii不支持优先级继承,而且其以任务的优先级作为任务标识,每个优先级只能有一个任务,因此,不适宜在应用程序中使用优先级继承。
3 uc/os-ii中优先级翻转问题的解决
在uc/os-ii中,为解决优先级翻转影响任务实时性的问题,可以借鉴优先级继承的方法对优先级天花板方法进行改进。对uc/os-ii的使用,共享资源任务的优先级不是全部提升,而是先判断再决定是否提升。即当有任务a申请共享资源s时,首先判断是否有别的的任务正在占用资源s,若无,则任务a继续执行,若有,假设为任务b正在使用该资源,则判断任务b的优先级是否低于任务a,若高于任务a,则任务a挂起,等待任务b释放该资源,如果任务b的优先级低于任务a,则提升任务b的优先级到该资源的优先级天花板,当任务b释放资源后,再恢复到原优先级。在uc/os-ii中,每个共享资源都可看作一个事件,每个事件都有相应的事件控制块ecb。在ecb中包含一个等待本事件的等待任务列表,该列表包括oseventtbl[]和oseventgrp两个域,通过对等待任务列表的判断可以很容易的确定是否有多个任务在等待该资源,同时也可判断任务的优先级与当前任务优先级的高低,从而决定是否需要用ostaskchangepio()来改变任务的优先级。这样,仅在优先级有可能发生翻转的情况下才改变任务的优先级,而且利用事件的等待任务列表进行判断,比用ostaskchangepio()来改变任务的优先级速度快,并占用较少的cpu时间,有利于系统实时性的提高。
总之,优先级翻转问题是多任务实时操作系统普遍存在的问题,这个问题也存在于uc/os-ii中。通过在应用程序中进行简单的判断,在可能出现优先级翻转的情况下动态的改变任务的优先级,可以有效地避免任务的优先级翻转,保证高优先级任务的执行,提高了系统的实时性。

展望未来 | Google Play 与时俱进,奔赴下一个十年
华为发布昇腾计算智能边缘解决方案:智能制造使能平台
云端线上展厅+夜游光影应用到现实的案例解析
电子病历可减轻医疗体系的资源压力
行业快讯:机器学习大会下周举行、亚马逊人脸识别引争议、华为2018年营收将达1000亿美元
uC/OS-II中优先级翻转问题
OMAP嵌入式处理器OMAP5910的基本特性及应用分析
薄膜电容155K和155J有什么区别
音频蓝牙芯片的原理及产品特点介绍
详细探讨晶片清洗和纹理的相互作用
RM3542A电阻计的特点及应用优势
戴尔XPS 13二合一7390值不值得买
什么是自适应控制_自适应控制基本原理
江西省2011年大学生电子设计自选赛赛题
多功能快速充电器,Quick Charger
AMD的第二代锐龙ThreadRipper正式发布,官方发布性能指标,与酷睿i9-7980XE哪个更好?
MySQL上亿大表如何深度优化呢
什么是超融合数据保护?
3个关于光模块温度范围的FAQ
台湾为何如此重视Micro-LED显示技术?