0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

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

星星科技指導員 ? 來源:嵌入式計算設計 ? 作者:Johan Kraft ? 2022-06-22 15:45 ? 次閱讀

具有固定優(yōu)先級調(diào)度程序的 RTOS 的核心思想是高優(yōu)先級任務應該在低優(yōu)先級任務之前調(diào)度。如有必要,RTOS 甚至可以搶占正在運行的任務,迫使它讓 CPU 執(zhí)行更高優(yōu)先級的任務。然而,作為開發(fā)人員,您必須注意可能導致較高優(yōu)先級任務必須等待較低優(yōu)先級任務的編程缺陷——這種情況稱為優(yōu)先級倒置。

優(yōu)先級反轉可以與互斥體、消息隊列或其他類型的同步對象一起發(fā)生。描述問題的最佳方式可能是通過一個示例來逐步說明。

在下面的時間線圖中,使用 Tracealyzer 捕獲,我們有一個低優(yōu)先級任務(綠色)正在執(zhí)行。它需要一個二進制信號量來保護某些臨界區(qū)并繼續(xù)在臨界區(qū)內(nèi)執(zhí)行代碼。當高優(yōu)先級任務(紅色)進入就緒狀態(tài)時,RTOS 搶占綠色任務并讓紅色運行。紅色任務嘗試獲取相同的二進制信號量,但由于低優(yōu)先級綠色任務持有它而被阻止。

到目前為止,一切都很好——這是預期的行為。一般來說,綠色任務現(xiàn)在會運行并快速釋放信號量,此時它再次被搶占,紅色任務可以獲取信號量并繼續(xù)。然而,這一次發(fā)生了反轉。出于某種原因,可能是定時等待已過期,中等優(yōu)先級(橙色)任務已進入就緒狀態(tài)并被允許在綠色任務之前執(zhí)行。由于橙色任務不知道有爭議的信號量,它很高興地運行完成。只有這樣,綠色任務才會最終運行,以便它可以釋放信號量并將執(zhí)行權交給紅色的高優(yōu)先級任務。

pYYBAGKyyLGAOwYtAAI9Uvf_ze8142.png

因此,高優(yōu)先級任務被阻塞,必須等待不確定的時間,而中等優(yōu)先級任務運行完成。這就是工作中的優(yōu)先級倒置。

重要的是要意識到這里涉及的三項任務基本上是無能為力的。他們沒有人可以做任何事情來避免倒置,至少在沒有 RTOS 的支持的情況下是這樣。幸運的是,這種支持在許多 RTOS 中以具有優(yōu)先級繼承的互斥鎖的形式提供?;コ饬浚ɑコ獾目s寫)是一種用于保護共享資源的信號量。優(yōu)先級繼承意味著如果一個高優(yōu)先級的任務在試圖獲得一個低優(yōu)先級任務當前持有的互斥鎖時阻塞,那么持有該互斥鎖的任務的優(yōu)先級會暫時提高到被阻塞任務的優(yōu)先級。在我們的場景中,當紅色任務被阻塞時,綠色任務將被提升為紅色優(yōu)先級,從而有效地阻止了橙色任務的運行。

優(yōu)先級繼承并不能真正治愈優(yōu)先級倒置,它只是在某些情況下將其影響最小化。硬實時應用程序仍應仔細設計,以便一開始就不會發(fā)生優(yōu)先級反轉。

通常,盡可能避免阻塞共享資源。例如,如果您的任務將數(shù)據(jù)寫入消息隊列(可能已滿),您可以改為使用足夠大但未滿的隊列,作為額外的預防措施,以非阻塞方式寫入并檢查任何失敗寫入的返回值。而不是使用分散在代碼中的多個關鍵部分(共享互斥鎖),您可以創(chuàng)建一個“服務器”任務,該任務執(zhí)行對資源的所有直接操作,并使用消息隊列從“客戶端”任務中獲取請求,在非-阻塞方式。服務器可以通過請求中指定的其他消息隊列發(fā)送任何回復,這些消息隊列由客戶端任務擁有。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10898

    瀏覽量

    212557
  • 服務器
    +關注

    關注

    12

    文章

    9277

    瀏覽量

    85824
  • RTOS
    +關注

    關注

    22

    文章

    819

    瀏覽量

    119793
收藏 人收藏

    評論

    相關推薦

    freertos中斷優(yōu)先級在哪設置

    FreeRTOS是一個流行的實時操作系統(tǒng),它廣泛應用于嵌入式系統(tǒng)開發(fā)。在FreeRTOS中,中斷優(yōu)先級是一個重要的概念,因為它決定了中斷處理的順序和響應時間。 1. 理解中斷優(yōu)先級 在討論如何設置
    的頭像 發(fā)表于 09-02 14:17 ?737次閱讀

    APS智能優(yōu)化排產(chǎn)軟件的優(yōu)先級應用

    資源、訂單需求和約束條件,自動計算出最優(yōu)的生產(chǎn)計劃。在這個過程中,訂單排產(chǎn)的優(yōu)先規(guī)則起著至關重要的作用。1.交期優(yōu)先級交期優(yōu)先級是訂單排產(chǎn)中最基本的優(yōu)先規(guī)則。根據(jù)
    的頭像 發(fā)表于 06-26 17:43 ?420次閱讀
    APS智能優(yōu)化排產(chǎn)軟件的<b class='flag-5'>優(yōu)先級</b>應用

    ESP32S2如何設置中斷優(yōu)先級?

    ESP32S2有六中斷, 如何設置中斷優(yōu)先級? 比如在GPIO例程里 ,這種中斷優(yōu)先級是如何設置的呢? 中斷寄存器列表里 ,只有簡稱,哪里能獲取這個名稱所對應的功能??
    發(fā)表于 06-21 07:59

    請問有什么方法降低WIFI中斷的優(yōu)先級?

    因為項目對時序輸出要求比較嚴格,WIFI中斷優(yōu)先級比硬件定時器中斷優(yōu)先級要高,在定時器中斷里面對GPIO管腳控制被延長執(zhí)行,請問有什么方法降低WIFI中斷的優(yōu)先級?
    發(fā)表于 06-19 07:37

    為什么不能在不同的優(yōu)先級中安裝相同的處理程序

    在不同的優(yōu)先級中安裝相同的處理程序? 我需要一個解決方案,在不同的優(yōu)先級中安裝相同的處理程序(ISR),以便在我的項目中處理 CAT2 中斷,但我不能上傳項目,因為我簽署了 NDA。
    發(fā)表于 05-31 08:16

    如何在不同優(yōu)先級安裝相同的處理程序?

    在不同的優(yōu)先級中安裝相同的處理程序? 我需要一個解決方案,在不同的優(yōu)先級中安裝相同的處理程序(ISR),以便在我的項目中處理 CAT2 中斷,但我不能上傳項目,因為我簽署了 NDA。
    發(fā)表于 05-28 08:13

    systick的中斷優(yōu)先級是否應該設置為最高優(yōu)先級的嵌套中斷?

    最近在學習ucosii有這樣一個疑問,關于stm32的systick作為ucosii的基準時鐘,systick的中斷優(yōu)先級是否應該設置為最高優(yōu)先級的嵌套中斷。理由是什么?各位大俠求指教?。?!
    發(fā)表于 05-16 06:44

    stm32的中斷優(yōu)先級分組了之后還能改分組嗎?

    如標題所示,stm32的中斷優(yōu)先級分組了之后還能改分組嗎? 比如我要使用外部中斷EXIT2,3,我在配置的時候配置了優(yōu)先級分組2組,然后配置了EXIT2,3,如果我下面又想開外部中斷的EXIT4,5的話,我是不是必須還的要使用優(yōu)先級
    發(fā)表于 05-13 08:40

    創(chuàng)建了兩個task如果一個優(yōu)先級高 一個優(yōu)先級低,高優(yōu)先級的那個一直在做,什么時候會調(diào)度到低優(yōu)先級的呢?

    創(chuàng)建了兩個task如果一個優(yōu)先級高一個優(yōu)先級低, 我看到任務的函數(shù)都是用死循環(huán)做的,那個高優(yōu)先級的那個一直在做,什么時候會調(diào)度到低優(yōu)先級的呢
    發(fā)表于 05-13 07:13

    求助,關于stm32F4中斷優(yōu)先級0無法搶占的問題求解

    搶占優(yōu)先級具有最高優(yōu)先級別。 現(xiàn)在我使用兩個定時器: 1)TIM2設置優(yōu)先級為0,TIM4設置優(yōu)先級為1 2)若先啟動TIM4,延時一下再啟
    發(fā)表于 04-23 07:26

    關于stm32cube中freertos的優(yōu)先級設置問題求解

    在用stm32cube中freertos,在配置界面里設置為12任務優(yōu)先級,但是在cube中配置每個任務優(yōu)先級時還是只能選擇7種優(yōu)先級,分別是:osPriorityIdle
    發(fā)表于 04-22 07:25

    嵌入式實時操作系統(tǒng)優(yōu)先級搶占式調(diào)度機制解析

    當搶占發(fā)生時,任務即使沒有完成也會被迫放棄處理器,此時任務并沒有被掛起,而是會返回就緒隊列。任務在隊列中的位置是由優(yōu)先級決定的,它會在隊列中等待到下一次被調(diào)度。
    的頭像 發(fā)表于 04-05 05:22 ?2900次閱讀
    嵌入式實時操作系統(tǒng)<b class='flag-5'>優(yōu)先級</b>搶占式<b class='flag-5'>調(diào)度</b>機制解析

    STM32F103的寄存器NVIC_IPRx搶占優(yōu)先級和子優(yōu)先級是怎么設置的?

    STM32F103的寄存器NVIC_IPRx有些不明白,搶占優(yōu)先級和子優(yōu)先級是怎么設置的? 如果,中斷分組2,搶占優(yōu)先級3,子優(yōu)先級3 那下面這樣寫對嗎? SCB->AIR
    發(fā)表于 03-27 07:48

    Hightec對芯片中斷優(yōu)先級分配時,中斷號越高中斷優(yōu)先級越高嗎?

    請問大佬,Hightec對芯片中斷優(yōu)先級分配時,中斷號越高中斷優(yōu)先級越高嗎?看網(wǎng)上的帖子說中斷號越低優(yōu)先級越高。
    發(fā)表于 02-27 06:13

    RTTnano的用戶main函數(shù)中的優(yōu)先級是多少?

    RTTnano 的用戶main函數(shù)中的優(yōu)先級是多少?為什么會出現(xiàn)創(chuàng)建新的task之后,main函數(shù)會搶占掉低優(yōu)先級的task,例如RT_THREAD_PRIORITY_MAX設置為8 ,低于3
    發(fā)表于 02-26 08:01