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