在嵌入式体系的使用中,实时性是一个重要的目标,而优先级翻转是影响体系实时性的重要问题。本文侧重剖析优先级翻转问题的产生和影响,以及在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(),等候用户程序的运转。