<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 關(guān)于uC/OS-II中優(yōu)先級翻轉問(wèn)題

關(guān)于uC/OS-II中優(yōu)先級翻轉問(wèn)題

作者: 時(shí)間:2006-04-20 來(lái)源:網(wǎng)絡(luò ) 收藏

引 言

1 的運行機制

  在嵌入式系統的應用中,實(shí)時(shí)性是一個(gè)重要的指標,而是影響系統實(shí)時(shí)性的重要。本文著(zhù)重分析的產(chǎn)生和影響,以及在中的解決方案。

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

2 uC/OS-II中的優(yōu)先級

  在uC/OS-II中,多個(gè)任務(wù)按照優(yōu)先級高低由內核調度執行,而且任務(wù)調度所花的時(shí)間是常數,與應用程序中建立的任務(wù)數無(wú)關(guān)。對于占先式內核,任務(wù)的響應時(shí)間是確定的,而且是最優(yōu)化的,占先式內核保證最高優(yōu)先級的任務(wù)最先執行。

  任務(wù)的響應時(shí)間=尋找最高優(yōu)先級任務(wù)的時(shí)間+任務(wù)切換時(shí)間
  
  在uC/OS-II中尋找進(jìn)入就緒態(tài)的最高優(yōu)先級任務(wù)是通過(guò)查就緒表實(shí)現的,這減少了所需時(shí)間。
y=OSUnMapTbl[OSRdyGrp];
x= OSUnMapTbl [OSRdyTbl[y]];
prio=(y3)+x;

  任務(wù)切換是通過(guò)調用匯編函數OS_TASK_SW()來(lái)實(shí)現的,主要完成兩個(gè)任務(wù)運行環(huán)境的保存和恢復。因此用戶(hù)可以通過(guò)安排任務(wù)的優(yōu)先級,保證系統的實(shí)時(shí)性。當涉及到共享資源的互斥訪(fǎng)問(wèn)時(shí),多任務(wù)實(shí)時(shí)操作系統常常會(huì )出現優(yōu)先級翻轉問(wèn)題(priority inversion),不能保證高優(yōu)先級任務(wù)的響應時(shí)間,影響系統的實(shí)時(shí)性,uC/OS-II中也存在同樣問(wèn)題。所謂優(yōu)先級翻轉問(wèn)題(priority inversion)即當一個(gè)高優(yōu)先級任務(wù)通過(guò)信號量機制訪(fǎng)問(wèn)共享資源時(shí),該信號量已被一低優(yōu)先級任務(wù)占有,而這個(gè)低優(yōu)先級任務(wù)在訪(fǎng)問(wèn)共享資源時(shí)可能又被其它一些中等優(yōu)先級的任務(wù)搶先,因此造成高優(yōu)先級任務(wù)被許多具有較低優(yōu)先級的任務(wù)阻塞,實(shí)時(shí)性難以得到保證。例如:有優(yōu)先級為A、B和C的三個(gè)任務(wù),優(yōu)先級A>B>C,任務(wù)A,B處于掛起狀態(tài),等待某一事件的發(fā)生,任務(wù)C正在運行,此時(shí)任務(wù)C開(kāi)始使用某一共享資源S。在使用中,任務(wù)A等待的事件到來(lái),任務(wù)A轉為就緒態(tài),因為它比任務(wù)C優(yōu)先級高,所以立即執行。當任務(wù)A要使用共享資源S時(shí),由于其正在被任務(wù)C使用,因此任務(wù)A被掛起,任務(wù)C開(kāi)始運行。如果此時(shí)任務(wù)B等待的事件到來(lái),則任務(wù)B轉為就緒態(tài)。由于任務(wù)B的優(yōu)先級比任務(wù)C高,因此任務(wù)B開(kāi)始運行,直到其運行完畢,任務(wù)C才開(kāi)始運行。直到任務(wù)C釋放共享資源S后,任務(wù)A才得以執行。在這種情況下,優(yōu)先級發(fā)生了翻轉,任務(wù)B先于任務(wù)A運行。這樣便不能保證高優(yōu)先級任務(wù)的響應時(shí)間,解決優(yōu)先級翻轉問(wèn)題有優(yōu)先級天花板(priority ceiling)和優(yōu)先級繼承(priority inheritance)兩種辦法。

  優(yōu)先級天花板是當任務(wù)申請某資源時(shí),把該任務(wù)的優(yōu)先級提升到可訪(fǎng)問(wèn)這個(gè)資源的所有任務(wù)中的最高優(yōu)先級,這個(gè)優(yōu)先級稱(chēng)為該資源的優(yōu)先級天花板。這種方法簡(jiǎn)單易行,不必進(jìn)行復雜的判斷,不管任務(wù)是否阻塞了高優(yōu)先級任務(wù)的運行,只要任務(wù)訪(fǎng)問(wèn)共享資源都會(huì )提升任務(wù)的優(yōu)先級。在uC/OS-II中,可以通過(guò)OSTaskChangePrio()改變任務(wù)的優(yōu)先級,但是改變任務(wù)的優(yōu)先級是很花時(shí)間的。如果不發(fā)生優(yōu)先級翻轉而提升了任務(wù)的優(yōu)先級,釋放資源后又改回原優(yōu)先級,則無(wú)形中浪費了許多CPU時(shí)間,也影響了系統的實(shí)時(shí)性。

  優(yōu)先級繼承是當任務(wù)A申請共享資源S時(shí),如果S正在被任務(wù)C使用,通過(guò)比較任務(wù)C與自身的優(yōu)先級,如發(fā)現任務(wù)C的優(yōu)先級小于自身的優(yōu)先級,則將任務(wù)C的優(yōu)先級提升到自身的優(yōu)先級,任務(wù)C釋放資源S后,再恢復任務(wù)C的原優(yōu)先級。這種方法只在占有資源的低優(yōu)先級任務(wù)阻塞了高優(yōu)先級任務(wù)時(shí)才動(dòng)態(tài)的改變任務(wù)的優(yōu)先級,如果過(guò)程較復雜,則需要進(jìn)行判斷。uC/OS-II不支持優(yōu)先級繼承,而且其以任務(wù)的優(yōu)先級作為任務(wù)標識,每個(gè)優(yōu)先級只能有一個(gè)任務(wù),因此,不適宜在應用程序中使用優(yōu)先級繼承。

3 uC/OS-II中優(yōu)先級翻轉問(wèn)題的解決

  在uC/OS-II中,為解決優(yōu)先級翻轉影響任務(wù)實(shí)時(shí)性的問(wèn)題,可以借鑒優(yōu)先級繼承的方法對優(yōu)先級天花板方法進(jìn)行改進(jìn)。對uC/OS-II的使用,共享資源任務(wù)的優(yōu)先級不是全部提升,而是先判斷再決定是否提升。即當有任務(wù)A申請共享資源S時(shí),首先判斷是否有別的的任務(wù)正在占用資源S,若無(wú),則任務(wù)A繼續執行,若有,假設為任務(wù)B正在使用該資源,則判斷任務(wù)B的優(yōu)先級是否低于任務(wù)A,若高于任務(wù)A,則任務(wù)A掛起,等待任務(wù)B釋放該資源,如果任務(wù)B的優(yōu)先級低于任務(wù)A,則提升任務(wù)B的優(yōu)先級到該資源的優(yōu)先級天花板,當任務(wù)B釋放資源后,再恢復到原優(yōu)先級。在uC/OS-II中,每個(gè)共享資源都可看作一個(gè)事件,每個(gè)事件都有相應的事件控制塊ECB。在ECB中包含一個(gè)等待本事件的等待任務(wù)列表,該列表包括OSEventTbl[]和OSEventGrp兩個(gè)域,通過(guò)對等待任務(wù)列表的判斷可以很容易的確定是否有多個(gè)任務(wù)在等待該資源,同時(shí)也可判斷任務(wù)的優(yōu)先級與當前任務(wù)優(yōu)先級的高低,從而決定是否需要用OSTaskChangePio()來(lái)改變任務(wù)的優(yōu)先級。這樣,僅在優(yōu)先級有可能發(fā)生翻轉的情況下才改變任務(wù)的優(yōu)先級,而且利用事件的等待任務(wù)列表進(jìn)行判斷,比用OSTaskChangePio()來(lái)改變任務(wù)的優(yōu)先級速度快,并占用較少的CPU時(shí)間,有利于系統實(shí)時(shí)性的提高。

  總之,優(yōu)先級翻轉問(wèn)題是多任務(wù)實(shí)時(shí)操作系統普遍存在的問(wèn)題,這個(gè)問(wèn)題也存在于uC/OS-II中。通過(guò)在應用程序中進(jìn)行簡(jiǎn)單的判斷,在可能出現優(yōu)先級翻轉的情況下動(dòng)態(tài)的改變任務(wù)的優(yōu)先級,可以有效地避免任務(wù)的優(yōu)先級翻轉,保證高優(yōu)先級任務(wù)的執行,提高了系統的實(shí)時(shí)性。

------------

μC/OS-II系列軟件版權的說(shuō)明

Micrium 公司產(chǎn)品包括μC/OS-II,μC/GUI,uC/FS,μC/TCP-IP,μC/USB等。Micrium 公司提供嵌入式系統應用方面的產(chǎn)品,并對其軟件擁有知識產(chǎn)權。Micrium花費了大量的時(shí)間和財力為嵌入式領(lǐng)域提供高質(zhì)量的軟件產(chǎn)品。所有上述產(chǎn)品都以源代碼的形式提供給客戶(hù),具有極大的適用性。產(chǎn)品不是免費軟件,也不是開(kāi)放源碼的軟件,因此,不能免費使用,需要清楚的闡明μC/OS-II和系列的軟件不是開(kāi)放源碼的免費軟件,這是和Linux完全不一樣的。

開(kāi)發(fā)和研究者可以通過(guò)購買(mǎi)Micrium公司的Jean先生的μC/OS-II的書(shū)籍,而得到μC/OS-II源代碼,但是僅可以作為個(gè)人和學(xué)校學(xué)習使用,所有和μC/OS-II直接和間接相關(guān)的商業(yè)目的行為,必須購買(mǎi)使用μC/OS-II及系列產(chǎn)品的商業(yè)授權,包括芯片/單板/系統廠(chǎng)家的任何參考設計,教學(xué)設備和最終的產(chǎn)品,如果沒(méi)有得到Micrium公司Jean先生簽字的合法授權都是不合法的使用, 這在μC/OS-II的書(shū)籍Micrium公司(www.micrium.com)和中國代理商-北京麥克泰軟件公司網(wǎng)站(www.bmrtech.com)上面中有明確規定。

Micrium公司其它軟件如μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等的銷(xiāo)售模式與μC/OS-II不同,如果沒(méi)有購買(mǎi)使用授權,完全不可以擁有該源代碼,也不能將源代碼用于產(chǎn)品的設計,培訓,教學(xué)和生產(chǎn)。

μC/OS-II, μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等授權方式有:?jiǎn)蝹€(gè)產(chǎn)品、產(chǎn)品線(xiàn)(系列)、按照CPU 劃分的產(chǎn)品三種形式,μC/OS-KA,μC/OS-VIEW 等工具是按照使用人的數目收取費用的,相對起傳統的RTOS 動(dòng)輒2-3萬(wàn)美圓的開(kāi)發(fā)費用和每塊單板的使用費(根據數量從數百到幾個(gè)美圓),μC/OS-II及系列產(chǎn)品是采用一次性的收費方式,應該只是大約相當于傳統RTOS 的10-20% 的總體費用。

如果您正在將μC/OS-II系列軟件用于您的產(chǎn)品,您需要購買(mǎi)并獲得正式使用授權。

北京麥克泰軟件技術(shù)有限公司

tcp/ip相關(guān)文章:tcp/ip是什么




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>