1、什么是優先級反轉
假設現在有三個任務TaskA(優先級高)、TaskB(優先級中)、TaskC(優先級低),一個信號量(Semaphore),此信號量用于任務之間爭奪某個資源。 在某一時刻,高優先級的TaskA和中優先級的TaskB由于其它原因掛起了,低優先級的TaskC獲得信號量,正在獨享這個資源,這時候高優先級TaskA就緒了,搶占了TaskC,高優先級的TaskA運行一段時間后也想得到這個信號量,但是信號量被低優先級的TaskC占用,無奈TaskA只能掛起等待,低優先級的TaskC獲得CPU, 這時候TaskB就緒了,再次搶占TaskC,但是這個TaskB并不想使用這個資源,沒有辦法,直到TaskB掛起后,才能運行TaskC,TaskC釋放信號量之后高優先級的TaskA才能執行。 看起來高優先級的TaskA還不如低優先級的TaskC優先級高,這就叫做優先級反轉,TaskB的存在加劇了優先級反轉。 這種優先級反轉問題在實時操作系統中帶來的影響不容小覷,因此我們在編寫代碼時要避免出現優先級翻轉影響實時性。
2、使用互斥信號量解決優先級翻轉問題。
在RTOS中可以使用互斥信號量解決優先級問題,如FreeRTOS、ucos等。 互斥信號量原理:如果一個互斥信號量被一個低優先級的TaskC獲得,此時如果高優先級的TaskA也想獲得這個信號量,由于信號量被TaskC占用,只能掛起,掛起TaskA的同時RTOS會把TaskC的優先級調整為和TaskA一樣,讓低優先級的TaskC繼續執行,直至TaskC釋放信號量,TaskC優先級恢復之前的優先級, 這時TaskA獲得信號量。 提升TaskC優先級是為了讓TaskC盡快地執行,執行完趕緊釋放信號量,減少高優先級任務的掛起時間。
//FreeRTOS
SemaphoreHandle_t xSemaphoreCreateMutex(void)
//ucos
OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)
-
RTOS
+關注
關注
22文章
819瀏覽量
119887 -
實時操作系統
+關注
關注
1文章
199瀏覽量
30825 -
信號量
+關注
關注
0文章
53瀏覽量
8373 -
優先級反轉
+關注
關注
0文章
2瀏覽量
1141 -
互斥信號量
+關注
關注
0文章
3瀏覽量
2054
發布評論請先 登錄
相關推薦
為什么UCOSII優先級反轉與理想值不符?
如何理解任務優先級反轉?
請問只有訪問共享資源時才會考慮優先級反轉嗎?
RT-Thread v4.0.4版本中解決的使用互斥量導致優先級反轉的問題探討
實時控制系統中優先級反轉問題的解決方法
嵌入式系統優先級反轉問題的分析
![嵌入式系統<b class='flag-5'>優先級</b><b class='flag-5'>反轉</b>問題的分析](https://file1.elecfans.com//web2/M00/A4/2A/wKgZomUMMvOALHcTAABElMtCtgs035.jpg)
關于嵌入式系統優先級反轉的原因及解決方法探討
![關于嵌入式系統<b class='flag-5'>優先級</b><b class='flag-5'>反轉</b>的原因及解決方法探討](https://file.elecfans.com/web1/M00/AC/1D/pIYBAF276OmAOpTyAABba3K-4N8922.png)
嵌入式系統中優先級反轉的產生原因及2種解決方案
![嵌入式系統中<b class='flag-5'>優先級</b><b class='flag-5'>反轉</b>的產生原因及2種解決方案](https://file.elecfans.com/web1/M00/B7/AC/pIYBAF5q3gmAJ3SbAABNPotiNaw493.png)
uC/OS-II學習筆記——優先級反轉與優先級繼承機制
![uC/OS-II學習筆記——<b class='flag-5'>優先級</b><b class='flag-5'>反轉</b>與<b class='flag-5'>優先級</b>繼承機制](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論