xenomai 應用開發 6 優先順序反轉 WT

2021-10-04 12:35:40 字數 3799 閱讀 2633

優先順序反**生在高優先順序任務被迫無限期等待低優先順序任務完成的情況下。例如,假設priohigh、priomedium和priolow分別是高優先順序、中等優先順序和低優先順序的任務。priolow通過獲取其關聯的二進位制訊號量來獲取資源。當priohigh搶占priolow並通過獲取相同的訊號量來爭用資源時,它就會被阻塞。如果priohigh被阻塞的時間不超過priolow完成對資源的處理所花費的時間,那麼就不會有問題,因為資源不能被搶占。但是,低優先順序的任務很容易被中等優先順序的任務priomedium搶占,這會阻止priolow放棄資源。這種情況可能會持續,在相當長的一段時間內阻塞priohigh。

如下圖所示:任務一開始執行並占有資源r1,當高優先順序的任務3執行時,將打斷任務1的執行,但是任務3也需要使用資源r1,與此同時任務2由掛起狀態轉為執行狀態,任務2的優先順序又比任務1的優先順序高,此時任務2並不需要r1的資源,則cpu開始執行任務2,則高任務的任務3,將被迫等待任務2的執行完畢,並等待任務1釋放資源r1.

為了解決優先順序反轉問題,xenomai提供了乙個所謂的互斥鎖,它總是強制執行優先順序繼承協議來解決優先順序反轉問題。因此,當使用這個互斥鎖時,將使用優先順序繼承演算法此演算法確保擁有受互斥鎖保護的資源的任務始終以阻塞在該互斥鎖上的最高優先順序任務的優先順序執行。當不再需要該資源時,該任務將放棄互斥鎖並返回到正常的優先順序。因此,可以防止具有中間優先順序的任務搶占cpu。

著名的廁所理論

區分一下訊號量與互斥量:

1、訊號量**都可以釋放,但互斥鎖只有獲得了其控制權的執行緒才可以釋放,即:只有「鎖上」它的那個執行緒才有「鑰匙」開啟它,有「所有權」的概念。

2、訊號量可能導致執行緒優先順序反轉,而互斥鎖可通過優先順序繼承的方法解決優先順序反轉問題

「火星探路者(mars pathfinder, mpf)」於2023年07月04日在火星表面著陸。在開始的幾天內工作穩定,並傳回大量資料,但是幾天後,「探路者」開始出現系統復位、資料丟失的現象。

經過研發人員的分析,最後得出結論,就是因為系統裡發生了優先順序反轉的問題。

火星探測器的優先順序翻轉

歷史上幾個因為程式設計開發中的錯誤或者漏洞造成慘痛損失的案例

1、建立乙個互斥量,允許多個任務同步對共享資源的訪問。

int rt_mutex_create  ( rt_mutex  * mutex,

const

char

* name

)

int rt_mutex_acquire 	( 	rt_mutex *  	mutex,rtime  	timeout )
mutex:互斥描述符

timeout:以時鐘節拍表示的延遲

3、釋放乙個互斥鎖

int rt_mutex_release 	( 	rt_mutex *  	mutex	)
此例程釋放以前通過呼叫rt_mutex_acquire()或rt_mutex_acquire_until()鎖定的互斥物件。如果互斥鎖處於掛起狀態,則第乙個等待任務(按優先順序順序)將立即解除鎖定並轉移互斥鎖的所有權;否則,互斥鎖將保持未鎖定狀態。

更多mutexapi

1、建立3個實時任務以不同的優先順序,並且給於兩個任務以同乙個訊號量資源,最終使任務發生優先順序反**

程式以及執行結果如圖所示:

程式6a:

2、修改6a程式,使用 mutex services 消除優先順序反轉問題。

程式以及輸出結果如下所示:

程式6b:

CSS優先順序應用

h5建議將網頁的兩大部分 內容與樣式 分開來處理,即html負責頁面框架內容,css負責控制樣式。這樣做的好處是分工明確,條理清晰,方便編寫與後期修改。html引用css的方式一般可分為三種 1 引用外部樣式表 最常用 2 在html頭部區 即開始 結束標籤之間 編寫樣式,樣式可被當前html應用 ...

時序約束優先順序 6 xdc約束優先順序

在xdc檔案中,按約束的先後順序依次被執行,因此,針對同乙個時鐘的不同約束,只有最後一條約束生效。雖然執行順序是從前到後,但優先順序卻不同 就像四則運算一樣,x 都是按照從左到右的順序執行,但x 的優先順序比 要高。時序例外的優先順序從高到低為 clock groups set clock grou...

python優先順序佇列 python 優先順序佇列

簡介 優先順序佇列是基於堆的,關於堆的時候可以參考文章堆,優先順序佇列就是入隊時,會分配乙個優先順序,之後出隊時,根據優先順序出列。如,入隊時 4,a 6,r 3 d 則出隊順序 6,r 4,a 3 d 優先順序佇列的python實現 class priorityqueue object def i...