引 言:
在嵌入式系统的应用中,实时性是一个重要的指标,而优先级翻转是影响系统实时性的重要问题。本文着重分析优先级翻转问题的产生和影响,以及在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
2 uC/OS-II中的优先级翻转问题
在uC/OS-II中,多个任务按照优先级高低由内核调度执行,而且任务调度所花的时间是常数,与应用程序中建立的任务数无关。对于占先式内核,任务的响应时间是确定的,而且是最优化的CONTROL ENGINEERING China版权所有,占先式内核保证最高优先级的任务最先执行。
任务的响应时间=寻找最高优先级任务的时间+任务切换时间
在uC/OS-II中寻找进入就绪态的最高优先级任务是通过查就绪表实现的,这减少了所需时间。
y=OSUnMapTbl[OSRdyGrp];
x= OSUnMapTbl [OSRdyTbl[y]];
prio=(y<<3)+x;
任务切换是通过调用汇编函数OS_TASK_SW()来实现的,主要完成两个任务运行环境的保存和恢复。因此用户可以通过安排任务的优先级,保证系统的实时性。当涉及到共享资源的互斥访问时,多任务实时操作系统常常会出现优先级翻转问题(priority inversion),不能保证高优先级任务的响应时间,影响系统的实时性控制工程网版权所有,uC/OS-II中也存在同样问题。所谓优先级翻转问题(priority inversion)即当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,而这个低优先级任务在访问共享资源时可能又被其它一些中等优先级的任务抢先,因此造成高优先级任务被许多具有较低优先级的任务阻塞,实时性难以得到保证。例如:有优先级为A、B和C的三个任务,优先级A>B>C,任务ACONTROL ENGINEERING China版权所有,B处于挂起状态,等待某一事件的发生,任务C正在运行,此时任务C开始使用某一共享资源S。在使用中,任务A等待的事件到来,任务A转为就绪态www.cechina.cn,因为它比任务C优先级高,所以立即执行。当任务A要使用共享资源S时,由于其正在被任务C使用,因此任务A被挂起,任务C开始运行。如果此时任务B等待的事件到来,则任务B转为就绪态。由于任务B的优先级比任务C高,因此任务B开始运行,直到其运行完毕,任务C才开始运行。直到任务C释放共享资源S后,任务A才得以执行。在这种情况下,优先级发生了翻转,任务B先于任务A运行。这样便不能保证高优先级任务的响应时间,解决优先级翻转问题有优先级天花板(priority ceiling)和优先级继承(priority inheritance)两种办法。
优先级天花板是当任务申请某资源时,把该任务的优先级提升到可访问这个资源的所有任务中的最高优先级,这个优先级称为该资源的优先级天花板。这种方法简单易行,不必进行复杂的判断,不管任务是否阻塞了高优先级任务的运行,只要任务访问共享资源都会提升任务的优先级。在uC/OS-II中,可以通过OSTaskChan