優(yōu)先級(jí)翻轉(zhuǎn)與優(yōu)先級(jí)繼承
優(yōu)先級(jí)翻轉(zhuǎn)在可剝奪內(nèi)核中是非常常見(jiàn)的,例子如下(H:High、M:Middle、L:Low)
任務(wù) H 和任務(wù) M 處于掛起狀態(tài),等待某一事件的發(fā)生,任務(wù) L 正在運(yùn)行。
某一時(shí)刻任務(wù) L 想要訪問(wèn)共享資源,在此之前它必須先獲得對(duì)應(yīng)該資源的信號(hào)量。
任務(wù) L 獲得信號(hào)量并開(kāi)始使用該共享資源。
由于任務(wù) H 優(yōu)先級(jí)高,它等待的事件發(fā)生后便剝奪了任務(wù) L 的 CPU 使用權(quán)。
任務(wù) H 開(kāi)始運(yùn)行。
任務(wù) H 運(yùn)行過(guò)程中也要使用任務(wù) L 正在使用著的資源,由于該資源的信號(hào)量還被任務(wù)L 占用著,任務(wù) H 只能進(jìn)入掛起狀態(tài),等待任務(wù) L
釋放該信號(hào)量。
任務(wù) L 繼續(xù)運(yùn)行。
由于任務(wù) M 的優(yōu)先級(jí)高于任務(wù) L,當(dāng)任務(wù) M 等待的事件發(fā)生后,任務(wù) M 剝奪了任務(wù)L 的 CPU 使用權(quán)。
任務(wù) M 處理該處理的事。
任務(wù) M 執(zhí)行完畢后,將 CPU 使用權(quán)歸還給任務(wù) L。
任務(wù) L 繼續(xù)運(yùn)行。
最終任務(wù) L 完成所有的工作并釋放了信號(hào)量,到此為止,由于實(shí)時(shí)內(nèi)核知道有個(gè)高優(yōu)先級(jí)的任務(wù)在等待這個(gè)信號(hào)量,故內(nèi)核做任務(wù)切換。
任務(wù) H 得到該信號(hào)量并接著運(yùn)行。
在這種情況下,任務(wù) H 的優(yōu)先級(jí)實(shí)際上降到了任務(wù) L 的優(yōu)先級(jí)水平。因?yàn)槿蝿?wù) H 要一直等待直到任務(wù) L 釋放其占用的那個(gè)共享資源。由于任務(wù) M剝奪了任務(wù) L 的 CPU 使用權(quán),使得任務(wù) H 的情況更加惡化,這樣就相當(dāng)于任務(wù) M 的優(yōu)先級(jí)高于任務(wù) H,導(dǎo)致優(yōu)先級(jí)翻轉(zhuǎn)。
Linux 用 rt_mutex 來(lái)解決該問(wèn)題,rt_mutex 是帶優(yōu)先級(jí)繼承的互斥鎖。
當(dāng)一個(gè) rt_mutex 正在被一個(gè)低優(yōu)先級(jí)的任務(wù)使用,而此時(shí)有個(gè)高優(yōu)先級(jí)的任務(wù)也嘗試獲取這個(gè) rt_mutex的話就會(huì)被阻塞。不過(guò)這個(gè)高優(yōu)先級(jí)的任務(wù)會(huì)將低優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)提升到與自己相同的優(yōu)先級(jí),這就是優(yōu)先級(jí)繼承。優(yōu)先級(jí)繼承盡可能的降低了高優(yōu)先級(jí)任務(wù)處于阻塞態(tài)的時(shí)間,并且將已經(jīng)出現(xiàn)的“優(yōu)先級(jí)翻轉(zhuǎn)”的影響降到最低。
優(yōu)先級(jí)繼承并不能完全的消除優(yōu)先級(jí)翻轉(zhuǎn),它只是盡可能的降低優(yōu)先級(jí)翻轉(zhuǎn)帶來(lái)的影響。
rt_mutex 不能用于中斷服務(wù)函數(shù)中,原因如下:
rt_mutex 有優(yōu)先級(jí)繼承的機(jī)制,所以只能用在任務(wù)中,不能用于中斷服務(wù)函數(shù)。
中斷服務(wù)函數(shù)中不能因?yàn)橐却?rt_mutex 而設(shè)置阻塞時(shí)間進(jìn)入阻塞態(tài)。
在 i2c_transfer 調(diào)用 __i2c_transfer 之前,就加了 rt_mutex,保證 I2C 傳輸盡快執(zhí)行。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1410瀏覽量
41150 -
子系統(tǒng)
+關(guān)注
關(guān)注
0文章
115瀏覽量
12696 -
I2C
+關(guān)注
關(guān)注
28文章
1537瀏覽量
127157
發(fā)布評(píng)論請(qǐng)先 登錄
嵌入式技術(shù)中如何定義進(jìn)程優(yōu)先級(jí)

基于優(yōu)先級(jí)搶占系統(tǒng)的QNX調(diào)度算法
RTOS應(yīng)用中的優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題
uC/OS-II中優(yōu)先級(jí)翻轉(zhuǎn)問(wèn)題
開(kāi)發(fā)過(guò)程中是什么原因?qū)е?b class='flag-5'>優(yōu)先級(jí)翻轉(zhuǎn)的?

cortex M內(nèi)核優(yōu)先級(jí)設(shè)置

2.FreeRTOS中斷優(yōu)先級(jí)和任務(wù)優(yōu)先級(jí)

STM32F103芯片中斷優(yōu)先級(jí)以及FreeRTOS優(yōu)先級(jí)設(shè)置

uC/OS-II學(xué)習(xí)筆記——優(yōu)先級(jí)反轉(zhuǎn)與優(yōu)先級(jí)繼承機(jī)制

中斷優(yōu)先級(jí)處理的原則及配置 搶占優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)的區(qū)別

具有固定優(yōu)先級(jí)調(diào)度程序RTOS的優(yōu)先級(jí)倒置

FreeRTOS任務(wù)的優(yōu)先級(jí)示例
Free RTOS的優(yōu)先級(jí)翻轉(zhuǎn)

什么是優(yōu)先級(jí)反轉(zhuǎn)

評(píng)論