uC OS優先順序反轉及解決

2021-06-01 19:00:55 字數 4059 閱讀 7953

**:

1 uc/os-ii的執行機制

在嵌入式系統的應用中,實時性是乙個重要的指標,而優先順序翻轉是影響系統實時性的重要問題。本文著重分析優先順序翻轉問題的產生和影響,以及在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(),等待使用者程式的執行。

2 uc/os-ii中的優先順序翻轉問題

在uc/os-ii中,多個任務按照優先順序高低由核心排程執行,而且任務排程所花的時間是常數,與應用程式中建立的任務數無關。對於佔先式核心,任務的響應時間是確定的,而且是最優化的,佔先式核心保證最高優先順序的任務最先執行。

任務的響應時間=尋找最高優先順序任務的時間+任務切換時間

在uc/os-ii中尋找進入就緒態的最高優先順序任務是通過查就緒表實現的,這減少了所需時間。

y=osunmaptbl[osrdygrp];

x= osunmaptbl [osrdytbl[y]];

prio=(y<<3)+x;

任務切換是通過呼叫彙編函式os_task_sw()來實現的,主要完成兩個任務執行環境的儲存和恢復。因此使用者可以通過安排任務的優先順序,保證系統的實時性。當涉及到共享資源的互斥訪問時,多工實時作業系統常常會出現優先順序翻轉問題(priority inversion),不能保證高優先順序任務的響應時間,影響系統的實時性,uc/os-ii中也存在同樣問題。所謂優先順序翻轉問題(priority inversion)即當乙個高優先順序任務通過訊號量機制訪問共享資源時,該訊號量已被一低優先順序任務占有,而這個低優先順序任務在訪問共享資源時可能又被其它一些中等優先順序的任務搶先,因此造成高優先順序任務被許多具有較低優先順序的任務阻塞,實時性難以得到保證。例如:有優先順序為a、b和c的三個任務,優先順序a>b>c,任務a,b處於掛起狀態,等待某一事件的發生,任務c正在執行,此時任務c開始使用某一共享資源s。在使用中,任務a等待的事件到來,任務a轉為就緒態,因為它比任務c優先順序高,所以立即執行。當任務a要使用共享資源s時,由於其正在被任務c使用,因此任務a被掛起,任務c開始執行。如果此時任務b等待的事件到來,則任務b轉為就緒態。由於任務b的優先順序比任務c高,因此任務b開始執行,直到其執行完畢,任務c才開始執行。直到任務c釋放共享資源s後,任務a才得以執行。在這種情況下,優先順序發生了翻轉,任務b先於任務a執行。這樣便不能保證高優先順序任務的響應時間,解決優先順序翻轉問題有優先順序天花板(priority ceiling)和優先順序繼承(priority inheritance)兩種辦法。

優先順序天花板是當任務申請某資源時,把該任務的優先順序提公升到可訪問這個資源的所有任務中的最高優先順序,這個優先順序稱為該資源的優先順序天花板。這種方法簡單易行,不必進行複雜的判斷,不管任務是否阻塞了高優先順序任務的執行,只要任務訪問共享資源都會提公升任務的優先順序。在uc/os-ii中,可以通過ostaskchangeprio()改變任務的優先順序,但是改變任務的優先順序是很花時間的。如果不發生優先順序翻轉而提公升了任務的優先順序,釋放資源後又改回原優先順序,則無形中浪費了許多cpu時間,也影響了系統的實時性。

優先順序繼承是當任務a申請共享資源s時,如果s正在被任務c使用,通過比較任務c與自身的優先順序,如發現任務c的優先順序小於自身的優先順序,則將任務 c的優先順序提公升到自身的優先順序,任務c釋放資源s後,再恢復任務c的原優先順序。這種方法只在占有資源的低優先順序任務阻塞了高優先順序任務時才動態的改變任務的優先順序,如果過程較複雜,則需要進行判斷。uc/os-ii不支援優先順序繼承,而且其以任務的優先順序作為任務標識,每個優先順序只能有乙個任務,因此,不適宜在應用程式中使用優先順序繼承。

3 uc/os-ii中優先順序翻轉問題的解決

在uc/os-ii中,為解決優先順序翻轉影響任務實時性的問題,可以借鑑優先順序繼承的方法對優先順序天花板方法進行改進。對uc/os-ii的使用,共享資源任務的優先順序不是全部提公升,而是先判斷再決定是否提公升。即當有任務a申請共享資源s時,首先判斷是否有別的的任務正在占用資源s,若無,則任務a繼續執行,若有,假設為任務b正在使用該資源,則判斷任務b的優先順序是否低於任務a,若高於任務a,則任務a掛起,等待任務b釋放該資源,如果任務b 的優先順序低於任務a,則提公升任務b的優先順序到該資源的優先順序天花板,當任務b釋放資源後,再恢復到原優先順序。在uc/os-ii中,每個共享資源都可看作乙個事件,每個事件都有相應的事件控制塊ecb。在ecb中包含乙個等待本事件的等待任務列表,該列表包括oseventtbl和 oseventgrp兩個域,通過對等待任務列表的判斷可以很容易的確定是否有多個任務在等待該資源,同時也可判斷任務的優先順序與當前任務優先順序的高低,從而決定是否需要用ostaskchangepio()來改變任務的優先順序。這樣,僅在優先順序有可能發生翻轉的情況下才改變任務的優先順序,而且利用事件的等待任務列表進行判斷,比用ostaskchangepio()來改變任務的優先順序速度快,並占用較少的cpu時間,有利於系統實時性的提高。

總之,優先順序翻轉問題是多工實時作業系統普遍存在的問題,這個問題也存在於uc/os-ii中。通過在應用程式中進行簡單的判斷,在可能出現優先順序翻轉的情況下動態的改變任務的優先順序,可以有效地避免任務的優先順序翻轉,保證高優先順序任務的執行,提高了系統的實時性。

關於μc/os-ii系列軟體版權的說明

micrium 公司產品包括μc/os-ii,μc/gui,uc/fs,μc/tcp-ip,μc/usb等。micrium 公司提供嵌入式系統應用方面的產品,並對其軟體擁有智財權。micrium花費了大量的時間和財力為嵌入式領域提供高質量的軟體產品。所有上述產品都以源**的形式提供給客戶,具有極大的適用性。產品不是免費軟體,也不是開放原始碼的軟體,因此,不能免費使用,需要清楚的闡明μc/os-ii和系列的軟體不是開放原始碼的免費軟體,這是和linux完全不一樣的。

開發和研究者可以通過購買micrium公司的jean先生的μc/os-ii的書籍,而得到μc/os-ii源**,但是僅可以作為個人和學校學習使用,所有和μc/os-ii直接和間接相關的商業目的行為,必須購買使用μc/os-ii及系列產品的商業授權,包括晶元/單板/系統廠家的任何參考設計,教學裝置和最終的產品,如果沒有得到micrium公司jean先生簽字的合法授權都是不合法的使用, 這在μc/os-ii的書籍micrium公司(www.micrium.com)和中國**商-北京麥克泰軟體公司**(www.bmrtech.com)上面中有明確規定。

micrium公司其它軟體如μc/gui,μc/fs,μc/tcp-ip,μc/usb 等的銷售模式與μc/os-ii不同,如果沒有購買使用授權,完全不可以擁有該源**,也不能將源**用於產品的設計,培訓,教學和生產。

μc/os-ii, μc/gui,μc/fs,μc/tcp-ip,μc/usb 等授權方式有:單個產品、產品線(系列)、按照cpu 劃分的產品三種形式,μc/os-ka,μc/os-view 等工具是按照使用人的數目收取費用的,相對起傳統的rtos 動輒2-3萬美圓的開發費用和每塊單板的使用費(根據數量從數百到幾個美圓),μc/os-ii及系列產品是採用一次性的收費方式,應該只是大約相當於傳統rtos 的10-20% 的總體費用。

如果您正在將μc/os-ii系列軟體用於您的產品,您需要購買並獲得正式使用授權。

優先順序反轉及解決辦法

上次去華為面試,被問及優先順序反轉及解決辦法,雖然以前有所了解,但好長時間沒用了,回答時竟然具體卡殼,真是汗顏。所以今天有必要再次理順一下優先順序反轉的相關知識。1 什麼是優先順序反轉 簡單從字面上來說,就是低優先順序的任務先於高優先順序的任務執行了,優先順序搞反了。那在什麼情況下會生這種情況呢?假...

優先順序反轉及解決辦法

上次去華為面試,被問及優先順序反轉及解決辦法,雖然以前有所了解,但好長時間沒用了,回答時竟然具體卡殼,真是汗顏。所以今天有必要再次理順一下優先順序反轉的相關知識。1 什麼是優先順序反轉 簡單從字面上來說,就是低優先順序的任務先於高優先順序的任務執行了,優先順序搞反了。那在什麼情況下會生這種情況呢?假...

優先順序反轉及解決辦法

1 什麼是優先順序反轉 簡單從字面上來說,就是低優先順序的任務先於高優先順序的任務執行了,優先順序搞反了。那在什麼情況下會生這種情況呢?假設三個任務準備執行,a,b,c,優先順序依次是a b c 首先 c處於執行狀態,獲得cpu正在執行,同時占有了某種資源 其次 a進入就緒狀態,因為優先順序比c高,...