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

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

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

I2C子系統(tǒng)優(yōu)先級翻轉(zhuǎn)與優(yōu)先級繼承

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-22 15:08 ? 次閱讀

優(yōu)先級翻轉(zhuǎn)與優(yōu)先級繼承

優(yōu)先級翻轉(zhuǎn)在可剝奪內(nèi)核中是非常常見的,例子如下(H:High、M:Middle、L:Low)

圖片

任務(wù) H 和任務(wù) M 處于掛起狀態(tài),等待某一事件的發(fā)生,任務(wù) L 正在運行。

某一時刻任務(wù) L 想要訪問共享資源,在此之前它必須先獲得對應(yīng)該資源的信號量。

任務(wù) L 獲得信號量并開始使用該共享資源。

由于任務(wù) H 優(yōu)先級高,它等待的事件發(fā)生后便剝奪了任務(wù) L 的 CPU 使用權(quán)。

任務(wù) H 開始運行。

任務(wù) H 運行過程中也要使用任務(wù) L 正在使用著的資源,由于該資源的信號量還被任務(wù)L 占用著,任務(wù) H 只能進入掛起狀態(tài),等待任務(wù) L
釋放該信號量。

任務(wù) L 繼續(xù)運行。

由于任務(wù) M 的優(yōu)先級高于任務(wù) L,當任務(wù) M 等待的事件發(fā)生后,任務(wù) M 剝奪了任務(wù)L 的 CPU 使用權(quán)。

任務(wù) M 處理該處理的事。

任務(wù) M 執(zhí)行完畢后,將 CPU 使用權(quán)歸還給任務(wù) L。

任務(wù) L 繼續(xù)運行。

最終任務(wù) L 完成所有的工作并釋放了信號量,到此為止,由于實時內(nèi)核知道有個高優(yōu)先級的任務(wù)在等待這個信號量,故內(nèi)核做任務(wù)切換。

任務(wù) H 得到該信號量并接著運行。

在這種情況下,任務(wù) H 的優(yōu)先級實際上降到了任務(wù) L 的優(yōu)先級水平。因為任務(wù) H 要一直等待直到任務(wù) L 釋放其占用的那個共享資源。由于任務(wù) M剝奪了任務(wù) L 的 CPU 使用權(quán),使得任務(wù) H 的情況更加惡化,這樣就相當于任務(wù) M 的優(yōu)先級高于任務(wù) H,導致優(yōu)先級翻轉(zhuǎn)。

Linux 用 rt_mutex 來解決該問題,rt_mutex 是帶優(yōu)先級繼承的互斥鎖。

當一個 rt_mutex 正在被一個低優(yōu)先級的任務(wù)使用,而此時有個高優(yōu)先級的任務(wù)也嘗試獲取這個 rt_mutex的話就會被阻塞。不過這個高優(yōu)先級的任務(wù)會將低優(yōu)先級任務(wù)的優(yōu)先級提升到與自己相同的優(yōu)先級,這就是優(yōu)先級繼承。優(yōu)先級繼承盡可能的降低了高優(yōu)先級任務(wù)處于阻塞態(tài)的時間,并且將已經(jīng)出現(xiàn)的“優(yōu)先級翻轉(zhuǎn)”的影響降到最低。

優(yōu)先級繼承并不能完全的消除優(yōu)先級翻轉(zhuǎn),它只是盡可能的降低優(yōu)先級翻轉(zhuǎn)帶來的影響。

rt_mutex 不能用于中斷服務(wù)函數(shù)中,原因如下:

rt_mutex 有優(yōu)先級繼承的機制,所以只能用在任務(wù)中,不能用于中斷服務(wù)函數(shù)。

中斷服務(wù)函數(shù)中不能因為要等待 rt_mutex 而設(shè)置阻塞時間進入阻塞態(tài)。

i2c_transfer 調(diào)用 __i2c_transfer 之前,就加了 rt_mutex,保證 I2C 傳輸盡快執(zhí)行。

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

    關(guān)注

    3

    文章

    1373

    瀏覽量

    40310
  • 子系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    109

    瀏覽量

    12412
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1489

    瀏覽量

    123900
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式技術(shù)中如何定義進程優(yōu)先級

    靜態(tài)優(yōu)先級是所有相關(guān)優(yōu)先級的計算的起點,要么繼承自父進程,要么用戶空間自行設(shè)定。一旦修改了靜態(tài)優(yōu)先級,那么normal priority和動態(tài)優(yōu)先級
    發(fā)表于 09-18 16:08 ?1562次閱讀
    嵌入式技術(shù)中如何定義進程<b class='flag-5'>優(yōu)先級</b>

    基于優(yōu)先級搶占系統(tǒng)的QNX調(diào)度算法

    調(diào)度算法,是基于優(yōu)先級的。QNX的線程優(yōu)先級,是一個0-255的數(shù)字,數(shù)字越大優(yōu)先級越高。所以,優(yōu)先級0是內(nèi)核中的idle線程。同時,優(yōu)先級
    發(fā)表于 10-31 09:17 ?738次閱讀

    RTOS應(yīng)用中的優(yōu)先級反轉(zhuǎn)問題

    在嵌入式系統(tǒng)中,如果使用基于優(yōu)先級調(diào)度算法的RTOS,系統(tǒng)中可能發(fā)生優(yōu)先級反轉(zhuǎn)現(xiàn)象。優(yōu)先級反轉(zhuǎn)用來描述
    發(fā)表于 12-14 11:00 ?1222次閱讀

    uC/OS-II中優(yōu)先級翻轉(zhuǎn)問題

    本文著重分析優(yōu)先級翻轉(zhuǎn)問題的產(chǎn)生和影響,以及在uC/OS-II中的解決方案,在嵌入式系統(tǒng)的應(yīng)用中,實時性是一個重要的指標,而優(yōu)先級翻轉(zhuǎn)是影響
    發(fā)表于 01-06 16:53 ?2397次閱讀

    開發(fā)過程中是什么原因?qū)е?b class='flag-5'>優(yōu)先級翻轉(zhuǎn)的?

    最近在開發(fā)過程中,遇到一個問題線程優(yōu)先級翻轉(zhuǎn)的問題。那什么原因?qū)е?b class='flag-5'>優(yōu)先級翻轉(zhuǎn)呢? 在RTOS開發(fā)中,優(yōu)先級
    的頭像 發(fā)表于 05-28 15:28 ?2286次閱讀
    開發(fā)過程中是什么原因?qū)е?b class='flag-5'>優(yōu)先級</b><b class='flag-5'>翻轉(zhuǎn)</b>的?

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

    Cortex M內(nèi)核中每個中斷都有一個8位的優(yōu)先級設(shè)置寄存器這個8位的寄存器可以分為搶占優(yōu)先級和子優(yōu)先級兩個部分(通過設(shè)置優(yōu)先級組設(shè)置)搶占優(yōu)先級
    發(fā)表于 12-01 11:51 ?4次下載
    cortex M內(nèi)核<b class='flag-5'>優(yōu)先級</b>設(shè)置

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

    FreeRTOS中斷優(yōu)先級和任務(wù)優(yōu)先級架構(gòu):Cortex-M3版本:FreeRTOS V9.0.0前言:最開始,我并沒有搞清楚什么是中斷優(yōu)先級和任務(wù)優(yōu)先級,但看了部分資料后發(fā)現(xiàn)這兩個并
    發(fā)表于 12-04 20:21 ?9次下載
    <b class='flag-5'>2</b>.FreeRTOS中斷<b class='flag-5'>優(yōu)先級</b>和任務(wù)<b class='flag-5'>優(yōu)先級</b>

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

    STM32F103只用了4個位來表達優(yōu)先級,因此最多支持16的可編程優(yōu)先級(0~15),15為最低優(yōu)先級。
    發(fā)表于 01-25 18:59 ?1次下載
    STM32F103芯片中斷<b class='flag-5'>優(yōu)先級</b>以及FreeRTOS<b class='flag-5'>優(yōu)先級</b>設(shè)置

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

    優(yōu)先級反轉(zhuǎn),是指某同步資源被較低優(yōu)先級的進程/線程所擁有,較高優(yōu)先級的進程/線程競爭該同步資源未獲得該資源,而使得較高優(yōu)先級進程/線程反而推遲被調(diào)度執(zhí)行的現(xiàn)象。
    發(fā)表于 02-09 10:33 ?2次下載
    uC/OS-II學習筆記——<b class='flag-5'>優(yōu)先級</b>反轉(zhuǎn)與<b class='flag-5'>優(yōu)先級</b><b class='flag-5'>繼承</b>機制

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

    首先我們需要知道什么是中斷優(yōu)先級:中斷優(yōu)先級是CPU響應(yīng)中斷的先后順序
    的頭像 發(fā)表于 05-18 15:10 ?2.8w次閱讀
    中斷<b class='flag-5'>優(yōu)先級</b>處理的原則及配置 搶占<b class='flag-5'>優(yōu)先級</b>和響應(yīng)<b class='flag-5'>優(yōu)先級</b>的區(qū)別

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

      優(yōu)先級繼承并不能真正治愈優(yōu)先級倒置,它只是在某些情況下將其影響最小化。硬實時應(yīng)用程序仍應(yīng)仔細設(shè)計,以便一開始就不會發(fā)生優(yōu)先級反轉(zhuǎn)。
    的頭像 發(fā)表于 06-22 15:45 ?1274次閱讀
    具有固定<b class='flag-5'>優(yōu)先級</b>調(diào)度程序RTOS的<b class='flag-5'>優(yōu)先級</b>倒置

    FreeRTOS任務(wù)的優(yōu)先級示例

    任務(wù)的優(yōu)先級:0~24之間。數(shù)字越大,任務(wù)優(yōu)先等級越高。高優(yōu)先級的任務(wù)優(yōu)先執(zhí)行。
    的頭像 發(fā)表于 09-15 11:13 ?2819次閱讀

    Free RTOS的優(yōu)先級翻轉(zhuǎn)

    優(yōu)先級翻轉(zhuǎn)簡介:就是高優(yōu)先級的任務(wù)運行起來的效果好像成了低優(yōu)先級,而低優(yōu)先級比高優(yōu)先級先運行;
    的頭像 發(fā)表于 02-10 15:31 ?1339次閱讀
    Free RTOS的<b class='flag-5'>優(yōu)先級</b><b class='flag-5'>翻轉(zhuǎn)</b>

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

    ,才能運行TaskC,TaskC釋放信號量之后高優(yōu)先級的TaskA才能執(zhí)行??雌饋砀?b class='flag-5'>優(yōu)先級的TaskA還不如低優(yōu)先級的TaskC優(yōu)先級高,這就叫做優(yōu)
    的頭像 發(fā)表于 04-24 13:01 ?2298次閱讀
    什么是<b class='flag-5'>優(yōu)先級</b>反轉(zhuǎn)

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

    中斷優(yōu)先級之前,我們需要理解中斷優(yōu)先級的概念。在嵌入式系統(tǒng)中,中斷是硬件或軟件事件,它們可以打斷CPU的當前執(zhí)行流程,讓CPU去處理更緊急的任務(wù)。中斷優(yōu)先級用于確定多個中斷請求之間的處
    的頭像 發(fā)表于 09-02 14:17 ?709次閱讀