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

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

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

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

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

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

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

圖片

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

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

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

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

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

任務(wù) H 運(yùn)行過程中也要使用任務(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 來解決該問題,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ì)被阻塞。不過這個(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)帶來的影響。

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)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1362

    瀏覽量

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

    關(guān)注

    0

    文章

    109

    瀏覽量

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

    關(guān)注

    28

    文章

    1477

    瀏覽量

    123105
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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