引 言:
1 uC/OS-II的運行機制
在嵌入式系統(tǒng)的應用中,實時性是一個重要的指標,而優(yōu)先級翻轉是影響系統(tǒng)實時性的重要問題。本文著重分析優(yōu)先級翻轉問題的產(chǎn)生和影響,以及在uC/OS-II中的解決方案。
uC/OS-II采用基于固定優(yōu)先級的占先式調(diào)度方式,是一個實時、多任務的操作系統(tǒng)。系統(tǒng)中的每個任務具有一個任務控制快OS_TCB,任務控制塊記錄任務執(zhí)行的環(huán)境,包括任務的優(yōu)先級,任務的堆棧指針,任務的相關事件控制塊指針等。內(nèi)核將系統(tǒng)中處于就緒態(tài)的任務在就緒表(ready list)進行標注,通過就緒表中的兩個變量OSRdyGrp和OSRdyTbl[]可快速查找系統(tǒng)中就緒的任務。在uC/OS-II中每個任務有唯一的優(yōu)先級,因此任務的優(yōu)先級也是任務的唯一編號(ID),可以作為任務的唯一標識。內(nèi)核可用控制塊優(yōu)先級表OSTCBPrioTbl[]由任務的優(yōu)先級查到任務控制塊的地址。uC/OS-II主要就是利用任務控制快OS_TCB、就緒表(ready list)和控制塊優(yōu)先級表OSTCBPrioTbl[]來進行任務調(diào)度的。任務調(diào)度程序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)。當這個任務運行完畢或因其它原因掛起時,任務調(diào)度程序OSSched()再次到就緒表(ready list)中尋找當前系統(tǒng)中處于就緒態(tài)中優(yōu)先級最高的任務,轉而執(zhí)行該任務,如此完成任務調(diào)度。若在任務運行時發(fā)生中斷,則轉向執(zhí)行中斷程序,執(zhí)行完畢后不是簡單的返回中斷調(diào)用處,而是由OSIntExit()程序進行任務調(diào)度,執(zhí)行當前系統(tǒng)中優(yōu)先級最高的就緒態(tài)任務。當系統(tǒng)中所有任務都執(zhí)行完畢時,任務調(diào)度程序OSSched()就不斷執(zhí)行優(yōu)先級最低的空閑任務OSTaskIdle(),等待用戶程序的運行。
2 uC/OS-II中的優(yōu)先級翻轉問題
在uC/OS-II中,多個任務按照優(yōu)先級高低由內(nèi)核調(diào)度執(zhí)行,而且任務調(diào)度所花的時間是常數(shù),與應用程序中建立的任務數(shù)無關。對于占先式內(nèi)核,任務的響應時間是確定的,而且是最優(yōu)化的,占先式內(nèi)核保證最高優(yōu)先級的任務最先執(zhí)行。
任務的響應時間=尋找最高優(yōu)先級任務的時間+任務切換時間
在uC/OS-II中尋找進入就緒態(tài)的最高優(yōu)先級任務是通過查就緒表實現(xiàn)的,這減少了所需時間。
y=OSUnMapTbl[OSRdyGrp];
x= OSUnMapTbl [OSRdyTbl[y]];
prio=(y<<3)+x;
任務切換是通過調(diào)用匯編函數(shù)OS_TASK_SW()來實現(xiàn)的,主要完成兩個任務運行環(huán)境的保存和恢復。因此用戶可以通過安排任務的優(yōu)先級,保證系統(tǒng)的實時性。當涉及到共享資源的互斥訪問時,多任務實時操作系統(tǒng)常常會出現(xiàn)優(yōu)先級翻轉問題(priority inversion),不能保證高優(yōu)先級任務的響應時間,影響系統(tǒng)的實時性,uC/OS-II中也存在同樣問題。所謂優(yōu)先級翻轉問題(priority inversion)即當一個高優(yōu)先級任務通過信號量機制訪問共享資源時,該信號量已被一低優(yōu)先級任務占有,而這個低優(yōu)先級任務在訪問共享資源時可能又被其它一些中等優(yōu)先級的任務搶先,因此造成高優(yōu)先級任務被許多具有較低優(yōu)先級的任務阻塞,實時性難以得到保證。例如:有優(yōu)先級為A、B和C的三個任務,優(yōu)先級A>B>C,任務A,B處于掛起狀態(tài),等待某一事件的發(fā)生,任務C正在運行,此時任務C開始使用某一共享資源S。在使用中,任務A等待的事件到來,任務A轉為就緒態(tài),因為它比任務C優(yōu)先級高,所以立即執(zhí)行。當任務A要使用共享資源S時,由于其正在被任務C使用,因此任務A被掛起,任務C開始運行。如果此時任務B等待的事件到來,則任務B轉為就緒態(tài)。由于任務B的優(yōu)先級比任務C高,因此任務B開始運行,直到其運行完畢,任務C才開始運行。直到任務C釋放共享資源S后,任務A才得以執(zhí)行。在這種情況下,優(yōu)先級發(fā)生了翻轉,任務B先于任務A運行。這樣便不能保證高優(yōu)先級任務的響應時間,解決優(yōu)先級翻轉問題有優(yōu)先級天花板(priority ceiling)和優(yōu)先級繼承(priority inheritance)兩種辦法。
優(yōu)先級天花板是當任務申請某資源時,把該任務的優(yōu)先級提升到可訪問這個資源的所有任務中的最高優(yōu)先級,這個優(yōu)先級稱為該資源的優(yōu)先級天花板。這種方法簡單易行,不必進行復雜的判斷,不管任務是否阻塞了高優(yōu)先級任務的運行,只要任務訪問共享資源都會提升任務的優(yōu)先級。在uC/OS-II中,可以通過OSTaskChangePrio()改變?nèi)蝿盏膬?yōu)先級,但是改變?nèi)蝿盏膬?yōu)先級是很花時間的。如果不發(fā)生優(yōu)先級翻轉而提升了任務的優(yōu)先級,釋放資源后又改回原優(yōu)先級,則無形中浪費了許多CPU時間,也影響了系統(tǒng)的實時性。
優(yōu)先級繼承是當任務A申請共享資源S時,如果S正在被任務C使用,通過比較任務C與自身的優(yōu)先級,如發(fā)現(xiàn)任務C的優(yōu)先級小于自身的優(yōu)先級,則將任務C的優(yōu)先級提升到自身的優(yōu)先級,任務C釋放資源S后,再恢復任務C的原優(yōu)先級。這種方法只在占有資源的低優(yōu)先級任務阻塞了高優(yōu)先級任務時才動態(tài)的改變?nèi)蝿盏膬?yōu)先級,如果過程較復雜,則需要進行判斷。uC/OS-II不支持優(yōu)先級繼承,而且其以任務的優(yōu)先級作為任務標識,每個優(yōu)先級只能有一個任務,因此,不適宜在應用程序中使用優(yōu)先級繼承。
3 uC/OS-II中優(yōu)先級翻轉問題的解決
在uC/OS-II中,為解決優(yōu)先級翻轉影響任務實時性的問題,可以借鑒優(yōu)先級繼承的方法對優(yōu)先級天花板方法進行改進。對uC/OS-II的使用,共享資源任務的優(yōu)先級不是全部提升,而是先判斷再決定是否提升。即當有任務A申請共享資源S時,首先判斷是否有別的的任務正在占用資源S,若無,則任務A繼續(xù)執(zhí)行,若有,假設為任務B正在使用該資源,則判斷任務B的優(yōu)先級是否低于任務A,若高于任務A,則任務A掛起,等待任務B釋放該資源,如果任務B的優(yōu)先級低于任務A,則提升任務B的優(yōu)先級到該資源的優(yōu)先級天花板,當任務B釋放資源后,再恢復到原優(yōu)先級。在uC/OS-II中,每個共享資源都可看作一個事件,每個事件都有相應的事件控制塊ECB。在ECB中包含一個等待本事件的等待任務列表,該列表包括OSEventTbl[]和OSEventGrp兩個域,通過對等待任務列表的判斷可以很容易的確定是否有多個任務在等待該資源,同時也可判斷任務的優(yōu)先級與當前任務優(yōu)先級的高低,從而決定是否需要用OSTaskChangePio()來改變?nèi)蝿盏膬?yōu)先級。這樣,僅在優(yōu)先級有可能發(fā)生翻轉的情況下才改變?nèi)蝿盏膬?yōu)先級,而且利用事件的等待任務列表進行判斷,比用OSTaskChangePio()來改變?nèi)蝿盏膬?yōu)先級速度快,并占用較少的CPU時間,有利于系統(tǒng)實時性的提高。
總之,優(yōu)先級翻轉問題是多任務實時操作系統(tǒng)普遍存在的問題,這個問題也存在于uC/OS-II中。通過在應用程序中進行簡單的判斷,在可能出現(xiàn)優(yōu)先級翻轉的情況下動態(tài)的改變?nèi)蝿盏膬?yōu)先級,可以有效地避免任務的優(yōu)先級翻轉,保證高優(yōu)先級任務的執(zhí)行,提高了系統(tǒng)的實時性。
------------
關于μC/OS-II系列軟件版權的說明
Micrium 公司產(chǎn)品包括μC/OS-II,μC/GUI,uC/FS,μC/TCP-IP,μC/USB等。Micrium 公司提供嵌入式系統(tǒng)應用方面的產(chǎn)品,并對其軟件擁有知識產(chǎn)權。Micrium花費了大量的時間和財力為嵌入式領域提供高質(zhì)量的軟件產(chǎn)品。所有上述產(chǎn)品都以源代碼的形式提供給客戶,具有極大的適用性。產(chǎn)品不是免費軟件,也不是開放源碼的軟件,因此,不能免費使用,需要清楚的闡明μC/OS-II和系列的軟件不是開放源碼的免費軟件,這是和Linux完全不一樣的。
開發(fā)和研究者可以通過購買Micrium公司的Jean先生的μC/OS-II的書籍,而得到μC/OS-II源代碼,但是僅可以作為個人和學校學習使用,所有和μC/OS-II直接和間接相關的商業(yè)目的行為,必須購買使用μC/OS-II及系列產(chǎn)品的商業(yè)授權,包括芯片/單板/系統(tǒng)廠家的任何參考設計,教學設備和最終的產(chǎn)品,如果沒有得到Micrium公司Jean先生簽字的合法授權都是不合法的使用, 這在μC/OS-II的書籍Micrium公司(www.micrium.com)和中國代理商-北京麥克泰軟件公司網(wǎng)站(www.bmrtech.com)上面中有明確規(guī)定。
Micrium公司其它軟件如μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等的銷售模式與μC/OS-II不同,如果沒有購買使用授權,完全不可以擁有該源代碼,也不能將源代碼用于產(chǎn)品的設計,培訓,教學和生產(chǎn)。
μC/OS-II, μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等授權方式有:單個產(chǎn)品、產(chǎn)品線(系列)、按照CPU 劃分的產(chǎn)品三種形式,μC/OS-KA,μC/OS-VIEW 等工具是按照使用人的數(shù)目收取費用的,相對起傳統(tǒng)的RTOS 動輒2-3萬美圓的開發(fā)費用和每塊單板的使用費(根據(jù)數(shù)量從數(shù)百到幾個美圓),μC/OS-II及系列產(chǎn)品是采用一次性的收費方式,應該只是大約相當于傳統(tǒng)RTOS 的10-20% 的總體費用。
如果您正在將μC/OS-II系列軟件用于您的產(chǎn)品,您需要購買并獲得正式使用授權。
北京麥克泰軟件技術有限公司