具有固定優先級調度程序的 RTOS 的核心思想是高優先級任務應該在低優先級任務之前調度。如有必要,RTOS 甚至可以搶占正在運行的任務,迫使它讓 CPU 執行更高優先級的任務。然而,作為開發人員,您必須注意可能導致較高優先級任務必須等待較低優先級任務的編程缺陷——這種情況稱為優先級倒置。
優先級反轉可以與互斥體、消息隊列或其他類型的同步對象一起發生。描述問題的最佳方式可能是通過一個示例來逐步說明。
在下面的時間線圖中,使用 Tracealyzer 捕獲,我們有一個低優先級任務(綠色)正在執行。它需要一個二進制信號量來保護某些臨界區并繼續在臨界區內執行代碼。當高優先級任務(紅色)進入就緒狀態時,RTOS 搶占綠色任務并讓紅色運行。紅色任務嘗試獲取相同的二進制信號量,但由于低優先級綠色任務持有它而被阻止。
到目前為止,一切都很好——這是預期的行為。一般來說,綠色任務現在會運行并快速釋放信號量,此時它再次被搶占,紅色任務可以獲取信號量并繼續。然而,這一次發生了反轉。出于某種原因,可能是定時等待已過期,中等優先級(橙色)任務已進入就緒狀態并被允許在綠色任務之前執行。由于橙色任務不知道有爭議的信號量,它很高興地運行完成。只有這樣,綠色任務才會最終運行,以便它可以釋放信號量并將執行權交給紅色的高優先級任務。
因此,高優先級任務被阻塞,必須等待不確定的時間,而中等優先級任務運行完成。這就是工作中的優先級倒置。
重要的是要意識到這里涉及的三項任務基本上是無能為力的。他們沒有人可以做任何事情來避免倒置,至少在沒有 RTOS 的支持的情況下是這樣。幸運的是,這種支持在許多 RTOS 中以具有優先級繼承的互斥鎖的形式提供?;コ饬浚ɑコ獾目s寫)是一種用于保護共享資源的信號量。優先級繼承意味著如果一個高優先級的任務在試圖獲得一個低優先級任務當前持有的互斥鎖時阻塞,那么持有該互斥鎖的任務的優先級會暫時提高到被阻塞任務的優先級。在我們的場景中,當紅色任務被阻塞時,綠色任務將被提升為紅色優先級,從而有效地阻止了橙色任務的運行。
優先級繼承并不能真正治愈優先級倒置,它只是在某些情況下將其影響最小化。硬實時應用程序仍應仔細設計,以便一開始就不會發生優先級反轉。
通常,盡可能避免阻塞共享資源。例如,如果您的任務將數據寫入消息隊列(可能已滿),您可以改為使用足夠大但未滿的隊列,作為額外的預防措施,以非阻塞方式寫入并檢查任何失敗寫入的返回值。而不是使用分散在代碼中的多個關鍵部分(共享互斥鎖),您可以創建一個“服務器”任務,該任務執行對資源的所有直接操作,并使用消息隊列從“客戶端”任務中獲取請求,在非-阻塞方式。服務器可以通過請求中指定的其他消息隊列發送任何回復,這些消息隊列由客戶端任務擁有。
審核編輯:郭婷
-
cpu
+關注
關注
68文章
10904瀏覽量
213023 -
服務器
+關注
關注
12文章
9304瀏覽量
86066 -
RTOS
+關注
關注
22文章
819瀏覽量
119889
發布評論請先 登錄
相關推薦
freertos中斷優先級在哪設置
ESP32S2如何設置中斷優先級?
請問有什么方法降低WIFI中斷的優先級?
為什么不能在不同的優先級中安裝相同的處理程序?
如何在不同優先級安裝相同的處理程序?
systick的中斷優先級是否應該設置為最高優先級的嵌套中斷?
stm32的中斷優先級分組了之后還能改分組嗎?
創建了兩個task如果一個優先級高 一個優先級低,高優先級的那個一直在做,什么時候會調度到低優先級的呢?
求助,關于stm32F4中斷優先級0無法搶占的問題求解
關于stm32cube中freertos的優先級設置問題求解
嵌入式實時操作系統優先級搶占式調度機制解析
![嵌入式實時操作系統<b class='flag-5'>優先級</b>搶占式<b class='flag-5'>調度</b>機制解析](https://file1.elecfans.com/web2/M00/C7/58/wKgaomYJEMKAKHYXAAAdAnktHlM187.png)
評論