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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

星星科技指導(dǎo)員 ? 來源:嵌入式計(jì)算設(shè)計(jì) ? 作者:Johan Kraft ? 2022-06-22 15:45 ? 次閱讀

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

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

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

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

pYYBAGKyyLGAOwYtAAI9Uvf_ze8142.png

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

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

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

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

審核編輯:郭婷

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

    關(guān)注

    68

    文章

    10810

    瀏覽量

    210878
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8976

    瀏覽量

    85098
  • RTOS
    +關(guān)注

    關(guān)注

    21

    文章

    809

    瀏覽量

    119366
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    freertos中斷優(yōu)先級(jí)在哪設(shè)置

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

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

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

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

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

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

    在不同的優(yōu)先級(jí)中安裝相同的處理程序? 我需要一個(gè)解決方案,在不同的優(yōu)先級(jí)中安裝相同的處理程序(ISR),以便在我的項(xiàng)目中處理 CAT2 中斷,但我不能上傳項(xiàng)目,因?yàn)槲液炇鹆?NDA。
    發(fā)表于 05-28 08:13

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

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

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

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

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

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

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

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

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

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

    Hightec對(duì)芯片中斷優(yōu)先級(jí)分配時(shí),中斷號(hào)越高中斷優(yōu)先級(jí)越高嗎?

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

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

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

    華為和思科默認(rèn)路由優(yōu)先級(jí)

    優(yōu)先級(jí)值不同,則優(yōu)先級(jí)值最小的為最優(yōu)路由(無論開銷值是否相同,另一種理解就是對(duì)不同路由來源或路由協(xié)議之間的比較)。
    的頭像 發(fā)表于 01-11 10:47 ?1041次閱讀

    GD32如何配置中斷優(yōu)先級(jí)分組以及中斷優(yōu)先級(jí)

    使用GD32 MCU的過程中,大家可能會(huì)有以下疑問:中斷優(yōu)先級(jí)如何配置和使用?
    的頭像 發(fā)表于 01-10 10:30 ?2899次閱讀
    GD32如何配置中斷<b class='flag-5'>優(yōu)先級(jí)</b>分組以及中斷<b class='flag-5'>優(yōu)先級(jí)</b>

    python中運(yùn)算符的優(yōu)先級(jí)大小

    Python中運(yùn)算符的優(yōu)先級(jí)決定了表達(dá)式中各個(gè)運(yùn)算符的計(jì)算順序。了解運(yùn)算符的優(yōu)先級(jí)對(duì)于正確理解和編寫復(fù)雜的表達(dá)式非常重要。本文將詳細(xì)介紹Python中運(yùn)算符的優(yōu)先級(jí),并給出一些示例來幫助讀者更好地理
    的頭像 發(fā)表于 11-29 16:21 ?3120次閱讀

    python運(yùn)算符優(yōu)先級(jí)順序口訣

    Python是一種非常流行的編程語言,具有廣泛的應(yīng)用領(lǐng)域。在Python中,運(yùn)算符是進(jìn)行各種數(shù)學(xué)和邏輯運(yùn)算的關(guān)鍵部分。了解運(yùn)算符的優(yōu)先級(jí)順序?qū)τ谡_理解和書寫Python代碼至關(guān)重要。在本文中,我們
    的頭像 發(fā)表于 11-22 14:34 ?2072次閱讀