在嵌入式系統(tǒng)的應用中,實時性是一個重要的指標,而優(yōu)先級翻轉是影響系統(tǒng)實時性的重要問題。本文著重分析優(yōu)先級翻轉問題的產生和影響,以及在uC/OS-II中的解決方案。
uC/OS-II采用基于固定優(yōu)先級的占先式調度方式,是一個實時、多任務的操作系統(tǒng)。系統(tǒng)中的每個任務具有一個任務控制快OS_TCB,任務控制塊記錄任務執(zhí)行的環(huán)境,包括任務的優(yōu)先級,任務的堆棧指針,任務的相關事件控制塊指針等。內核將系統(tǒng)中處于就緒態(tài)的任務在就緒表(ready list)進行標注,通過就緒表中的兩個變量OSRdyGrp和OSRdyTbl[]可快速查找系統(tǒng)中就緒的任務。在uC/OS-II中每個任務有唯一的優(yōu)先級,因此任務的優(yōu)先級也是任務的唯一編號(ID),可以作為任務的唯一標識。內核可用控制塊優(yōu)先級表OSTCBPrioTbl[]由任務的優(yōu)先級查到任務控制塊的地址。uC/OS-II主要就是利用任務控制快OS_TCB、就緒表(ready list)和控制塊優(yōu)先級表OSTCBPrioTbl[]來進行任務調度的。任
務調度程序OSSched()首先由就緒表(ready list)中找到當前系統(tǒng)中處于就緒態(tài)的優(yōu)先級最高的任務,然后根據(jù)其優(yōu)先級由控制塊優(yōu)先級表OSTCBPrioTbl[]取得相應任務控制塊的地址,由OS_TASK_SW()程序進行運行環(huán)境的切換。將當前運行環(huán)境切換成該任務的運行環(huán)境,則該任務由就緒態(tài)轉為運行態(tài)。當這個任務運行完畢或因其它原因掛起時,任務調度程序OSSched()再次到就緒表(ready list)中尋找當前系統(tǒng)中處于就緒態(tài)中優(yōu)先級最高的任務,轉而執(zhí)行該任務,如此完成任務調度。若在任務運行時發(fā)生中斷,則轉向執(zhí)行中斷程序,執(zhí)行完畢后不是簡單的返回中斷調用處,而是由OSIntExit()程序進行任務調度,執(zhí)行當前系統(tǒng)中優(yōu)先級最高的就緒態(tài)任務。當系統(tǒng)中所有任務都執(zhí)行完畢時,任務調度程序OSSched()就不斷執(zhí)行優(yōu)先級最低的空閑任務OSTaskIdle(),等待用戶程序的運行。