1、什么是優(yōu)先級反轉(zhuǎn)
假設(shè)現(xiàn)在有三個任務(wù)TaskA(優(yōu)先級高)、TaskB(優(yōu)先級中)、TaskC(優(yōu)先級低),一個信號量(Semaphore),此信號量用于任務(wù)之間爭奪某個資源。 在某一時刻,高優(yōu)先級的TaskA和中優(yōu)先級的TaskB由于其它原因掛起了,低優(yōu)先級的TaskC獲得信號量,正在獨享這個資源,這時候高優(yōu)先級TaskA就緒了,搶占了TaskC,高優(yōu)先級的TaskA運行一段時間后也想得到這個信號量,但是信號量被低優(yōu)先級的TaskC占用,無奈TaskA只能掛起等待,低優(yōu)先級的TaskC獲得CPU, 這時候TaskB就緒了,再次搶占TaskC,但是這個TaskB并不想使用這個資源,沒有辦法,直到TaskB掛起后,才能運行TaskC,TaskC釋放信號量之后高優(yōu)先級的TaskA才能執(zhí)行。 看起來高優(yōu)先級的TaskA還不如低優(yōu)先級的TaskC優(yōu)先級高,這就叫做優(yōu)先級反轉(zhuǎn),TaskB的存在加劇了優(yōu)先級反轉(zhuǎn)。 這種優(yōu)先級反轉(zhuǎn)問題在實時操作系統(tǒng)中帶來的影響不容小覷,因此我們在編寫代碼時要避免出現(xiàn)優(yōu)先級翻轉(zhuǎn)影響實時性。
2、使用互斥信號量解決優(yōu)先級翻轉(zhuǎn)問題。
在RTOS中可以使用互斥信號量解決優(yōu)先級問題,如FreeRTOS、ucos等。 互斥信號量原理:如果一個互斥信號量被一個低優(yōu)先級的TaskC獲得,此時如果高優(yōu)先級的TaskA也想獲得這個信號量,由于信號量被TaskC占用,只能掛起,掛起TaskA的同時RTOS會把TaskC的優(yōu)先級調(diào)整為和TaskA一樣,讓低優(yōu)先級的TaskC繼續(xù)執(zhí)行,直至TaskC釋放信號量,TaskC優(yōu)先級恢復(fù)之前的優(yōu)先級, 這時TaskA獲得信號量。 提升TaskC優(yōu)先級是為了讓TaskC盡快地執(zhí)行,執(zhí)行完趕緊釋放信號量,減少高優(yōu)先級任務(wù)的掛起時間。
//FreeRTOS
SemaphoreHandle_t xSemaphoreCreateMutex(void)
//ucos
OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)
-
RTOS
+關(guān)注
關(guān)注
22文章
811瀏覽量
119595 -
實時操作系統(tǒng)
+關(guān)注
關(guān)注
1文章
197瀏覽量
30753 -
信號量
+關(guān)注
關(guān)注
0文章
53瀏覽量
8331 -
優(yōu)先級反轉(zhuǎn)
+關(guān)注
關(guān)注
0文章
2瀏覽量
1123 -
互斥信號量
+關(guān)注
關(guān)注
0文章
3瀏覽量
2027
發(fā)布評論請先 登錄
相關(guān)推薦
評論