chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

揭秘!基于RT-Thread探究“優(yōu)先級(jí)反轉(zhuǎn)”下的任務(wù)調(diào)度究竟是什么樣的?| 技術(shù)集結(jié)

RT-Thread官方賬號(hào) ? 2025-08-17 10:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文將基于RT-Thread,結(jié)合 RT-Trace 調(diào)試器細(xì)化到實(shí)際任務(wù)調(diào)度的粒度,來調(diào)試并逐步講解“優(yōu)先級(jí)反轉(zhuǎn)”的調(diào)度和運(yùn)行邏輯。如果對(duì) RT-Trace 感興趣的可以看這篇文章:

國(guó)產(chǎn)嵌入式調(diào)試器之光? RT-Trace 初體驗(yàn)!

廢話不多說,我們直接開始。本文基于 RT-Thread 來編寫測(cè)試代碼。在此之前我們先捋一下代碼流程:

優(yōu)先級(jí)反轉(zhuǎn)問題的本質(zhì)是高優(yōu)先級(jí)任務(wù)因等待低優(yōu)先級(jí)任務(wù)釋放資源而被阻塞,同時(shí)又有其他中優(yōu)先級(jí)任務(wù)搶占了 CPU,使得低優(yōu)先級(jí)任務(wù)得不到執(zhí)行機(jī)會(huì),進(jìn)而導(dǎo)致高優(yōu)先級(jí)任務(wù)長(zhǎng)時(shí)間無法繼續(xù)運(yùn)行。

因此我們需要建立三個(gè)不同優(yōu)先級(jí)的任務(wù),然后需要有一個(gè)資源鎖來模擬實(shí)際場(chǎng)景下對(duì)共享資源的獲取與釋放。一般在 RTOS 中我們會(huì)使用互斥鎖來對(duì)資源進(jìn)行上鎖,因此絕大多數(shù)的 RTOS 已經(jīng)為互斥鎖這個(gè)組件加入了優(yōu)先級(jí)繼承等應(yīng)對(duì)優(yōu)先級(jí)反轉(zhuǎn)問題的功能,包括 RT-Thread(RTT 的互斥鎖還具備優(yōu)先級(jí)天花板功能),所以如果我們就是想觀察優(yōu)先級(jí)反轉(zhuǎn)的現(xiàn)象,直接使用互斥鎖是不行的。

幸運(yùn)的是,在 RT-Thread 中,還有一個(gè)線程間同步組件,其是不帶優(yōu)先級(jí)繼承等功能的,并且在我們目前的場(chǎng)景中也可以作為資源鎖來使用,這就是二值信號(hào)量。(特別注意,這邊使用二值信號(hào)量作為資源鎖只是用于觀察優(yōu)先級(jí)反轉(zhuǎn)這種異?,F(xiàn)象,并且也正是因?yàn)槠浯嬖谶@個(gè)問題,實(shí)際項(xiàng)目中并不推薦這么使用?。?/strong>

綜上,我們的測(cè)試代碼主體就是三個(gè)不同優(yōu)先級(jí)的任務(wù),加上一個(gè)資源鎖。且我們要測(cè)試三種情況,分別是用信號(hào)量實(shí)現(xiàn)優(yōu)先級(jí)反轉(zhuǎn),用互斥鎖實(shí)現(xiàn)優(yōu)先級(jí)繼承,在互斥鎖的基礎(chǔ)上通過設(shè)置天花板優(yōu)先級(jí)來實(shí)現(xiàn)優(yōu)先級(jí)天花板機(jī)制,整體測(cè)試代碼如下:

#include"rtdef.h"#include"rttypes.h"#include#include#include#include#ifndefRT_USING_NANO#include#endif/* RT_USING_NANO *//* defined the LED0 pin: PB1 */#defineTHREAD_PRIORITY 10#defineUSE_MUTEX 0#defineUSE_PRIORITY_CEILING 0#ifUSE_MUTEXrt_mutex_tmutex;#elsert_sem_tsem;#endifstaticvoidworking(uint32_tnms){ for(volatileuint32_ti =0; i < nms; i++) {? ? ? ? for?(volatileuint32_t?j =?0; j

以上代碼動(dòng)態(tài)創(chuàng)建了三個(gè)任務(wù):th、tm和tl,分別對(duì)應(yīng)高優(yōu)先級(jí)(9),中優(yōu)先級(jí)(10)和低優(yōu)先級(jí)(11),在 RT-Thread 中優(yōu)先級(jí)數(shù)字越小越高。同時(shí)還基于條件編譯定義了一個(gè)資源鎖,當(dāng)USE_MUTEX為0時(shí)使用信號(hào)量作為鎖,用于制造優(yōu)先級(jí)反轉(zhuǎn),為1且USE_PRIORITY_CEILING為0時(shí)使用互斥鎖實(shí)現(xiàn)優(yōu)先級(jí)繼承,USE_MUTEX以及USE_PRIORITY_CEILING都為1時(shí)實(shí)現(xiàn)優(yōu)先級(jí)天花板策略。

working 函數(shù)本質(zhì)上是制造一段時(shí)間的延遲用于模擬任務(wù)的工作流程,此處沒有使用 rt_thread_mdelay 延時(shí)的原因是 rt_thread_mdelay 會(huì)造成任務(wù)本身主動(dòng)讓出,從而無法實(shí)現(xiàn)真實(shí)情況下高優(yōu)先級(jí)在低優(yōu)先級(jí)任務(wù)運(yùn)行中的搶占過程。

th 任務(wù)首先使用 rt_thread_mdelay 延遲主動(dòng)讓出使得低優(yōu)先級(jí)任務(wù)能夠先運(yùn)行從而獲取到資源,緊接著嘗試獲取資源,獲取到后使用 working 函數(shù)模擬對(duì)資源進(jìn)行的操作,最后釋放資源。

tm 任務(wù)首先使用 rt_thread_mdelay 延遲主動(dòng)讓出使得高優(yōu)先級(jí)任務(wù)能夠有時(shí)間運(yùn)行到嘗試獲取資源并阻塞,從而能夠成功制造出中優(yōu)先級(jí)對(duì)低優(yōu)先級(jí)任務(wù)的搶占。緊接著使用working函數(shù)模擬其運(yùn)行。注意,該任務(wù)中沒有任何對(duì)資源的操作,也不會(huì)獲取與釋放鎖。

tl 任務(wù)開始運(yùn)行后立馬嘗試獲取資源,進(jìn)而使用working函數(shù)模擬對(duì)資源進(jìn)行的操作,接著釋放資源,最后再次使用working函數(shù)模擬該任務(wù)的其他操作。

在開啟了優(yōu)先級(jí)天花板機(jī)制的情況下,互斥鎖創(chuàng)建后會(huì)使用 rt_mutex_setprioceiling 為其設(shè)置一個(gè)天花板優(yōu)先級(jí),在這里也就是 THREAD_PRIORITY - 2,雖然我們所有任務(wù)的最高優(yōu)先級(jí)為 THREAD_PRIORITY - 1,由于 RT-Thread 存在時(shí)間片輪轉(zhuǎn)調(diào)度功能,同優(yōu)先級(jí)任務(wù)在時(shí)間片用完之后也能互相搶占。此處也可以設(shè)置一個(gè)比較大的時(shí)間片來臨時(shí)防止搶占,我這里就直接將該優(yōu)先級(jí)設(shè)置為更高一級(jí),從根本上避免搶占的發(fā)生。

OK,所有功能點(diǎn)都講解完成,接下來我們就借助 RT-Trace 的運(yùn)行跟蹤功能,進(jìn)入 CPU 視角,來看看底層的真實(shí)運(yùn)行情況。

首先是使用信號(hào)量實(shí)現(xiàn)的優(yōu)先級(jí)反轉(zhuǎn)場(chǎng)景,我們重點(diǎn)關(guān)注三個(gè)任務(wù)之間的運(yùn)行,屏蔽掉中斷,空閑線程等其他信息:

e70a91ce-7b0e-11f0-9080-92fbcf53809c.png

可以看到 tl 在開始運(yùn)行了一段時(shí)間后 th 發(fā)生了搶占并嘗試獲取資源,但由于當(dāng)前資源被 tl 持有,于是 th 立馬阻塞讓出了 CPU 等待 tl 釋放資源:

e71b7a70-7b0e-11f0-9080-92fbcf53809c.png

然而還沒等 tl 釋放資源,中等優(yōu)先級(jí)的 tm 就搶占了 tl 的運(yùn)行,此時(shí) th 雖有著最高優(yōu)先級(jí),但也只能眼睜睜等著 tm 執(zhí)行完,因?yàn)橐?tl 釋放資源它才能運(yùn)行,但 tl 優(yōu)先級(jí)沒有 tm 高,當(dāng)前情況下 tm 不運(yùn)行完, tl 根本不會(huì)運(yùn)行:

e724c404-7b0e-11f0-9080-92fbcf53809c.png

等 tm 終于運(yùn)行完了,把 CPU 給到 tl,并且 tl 釋放了資源后,本應(yīng)是最高優(yōu)先級(jí)的 th 才得以運(yùn)行:

e7330e88-7b0e-11f0-9080-92fbcf53809c.png

由于低優(yōu)先級(jí)任務(wù)持有了高優(yōu)先級(jí)任務(wù)運(yùn)行所需的共享資源,從而導(dǎo)致高優(yōu)先級(jí)任務(wù)不可避免地進(jìn)入等待,而當(dāng)系統(tǒng)比較復(fù)雜,任務(wù)較多時(shí),低優(yōu)先級(jí)任務(wù)又特別容易被其他中優(yōu)先級(jí)任務(wù)搶占,最終導(dǎo)致高優(yōu)先級(jí)任務(wù)被無限延后,直至所有搶占的任務(wù)運(yùn)行完并且低優(yōu)先級(jí)任務(wù)釋放資源才得以運(yùn)行,而這個(gè)過程需要等待多久是未知且不可控的。在很多工業(yè)、醫(yī)療、軍事領(lǐng)域中,一個(gè)任務(wù)之所以要定義為高優(yōu)先級(jí),就是需要其盡快執(zhí)行,并且運(yùn)行周期嚴(yán)格可控,否則很有可能造成不可挽回的后果,如果這個(gè)過程中遇到優(yōu)先級(jí)反轉(zhuǎn),那系統(tǒng)異常甚至崩潰幾乎是必然的!

現(xiàn)在我們將 USE_MUTEX 置 1 來使用帶有優(yōu)先級(jí)繼承功能的互斥鎖,此時(shí)的任務(wù)調(diào)度過程如下:

e73ddad4-7b0e-11f0-9080-92fbcf53809c.png

很明顯,此時(shí)中優(yōu)先級(jí)任務(wù)沒有能搶占低優(yōu)先級(jí)任務(wù)在共享資源處理階段的運(yùn)行,雖然高優(yōu)先級(jí)任務(wù)第一次嘗試獲取資源會(huì)失敗,但這個(gè)過程也臨時(shí)抬升了tl的優(yōu)先級(jí):

e74aeff8-7b0e-11f0-9080-92fbcf53809c.png

而后 tl 得以不被中優(yōu)先級(jí)的 tm 打斷,一路運(yùn)行到釋放資源,緊接著 th 獲取資源執(zhí)行,而 tm 自然是等到 th 運(yùn)行完后才能運(yùn)行。很明顯,優(yōu)先級(jí)反轉(zhuǎn)帶來的影響在這種機(jī)制下得到大幅緩解,但這里仍然有一個(gè)小瑕疵:

e75360c0-7b0e-11f0-9080-92fbcf53809c.png

在 tl 對(duì)共享資源進(jìn)行處理的過程中,仍然發(fā)生了一次搶占,這期間還會(huì)動(dòng)態(tài)修改任務(wù)的優(yōu)先級(jí),稍許拉長(zhǎng)了tl 對(duì)資源的處理時(shí)間。如果頻繁操作資源,那么這對(duì)系統(tǒng)調(diào)度來說也是消耗比較大的。如果想要保證高優(yōu)先級(jí)任務(wù)能夠盡快執(zhí)行,那么這一段操作一定是要去除的。如何去除?這就引出了下面這個(gè)機(jī)制。

我們?cè)賹?USE_PRIORITY_CEILING 置 1 打開優(yōu)先級(jí)天花板,注意優(yōu)先級(jí)天花板的值是預(yù)設(shè)且靜態(tài)的,所以我們?cè)谑褂眠@個(gè)特性的時(shí)候需要提前設(shè)置好值:

rt_mutex_setprioceiling(mutex, THREAD_PRIORITY -2);

這個(gè)值一般會(huì)設(shè)置成使用資源中所有任務(wù)的最高優(yōu)先級(jí),當(dāng)然文章開頭也講過由于 RT-Thread 相同優(yōu)先級(jí)可以通過輪轉(zhuǎn)調(diào)度機(jī)制相互搶占,我這邊為了避免這種情況,所以設(shè)置為最高任務(wù)優(yōu)先級(jí)的更高一級(jí)。

我們來看下加入了優(yōu)先級(jí)天花板后任務(wù)的調(diào)度情況:

e75f0e34-7b0e-11f0-9080-92fbcf53809c.png

乍一看好像與優(yōu)先級(jí)繼承的調(diào)度情況沒有區(qū)別,接下來我將 tl 操作共享資源的時(shí)間軸放大:

e7683716-7b0e-11f0-9080-92fbcf53809c.png

對(duì)比優(yōu)先級(jí)繼承機(jī)制下的這部分:

e7758268-7b0e-11f0-9080-92fbcf53809c.png

可以看到中間 th 對(duì) tl 的搶占過程消失了!

e77eafa0-7b0e-11f0-9080-92fbcf53809c.png

正是由于我們?cè)O(shè)置了天花板優(yōu)先級(jí),tl 在獲取資源的那一刻就將其優(yōu)先級(jí)提升到了天花板,因此在這過程中即使是高優(yōu)先級(jí)的 th 也無法對(duì)其進(jìn)行搶占,真正做到了最快的資源處理速度,自然 th 在這種情況下也得到了最快的響應(yīng)運(yùn)行速度。

通過上述內(nèi)容,相信大家已經(jīng)對(duì)優(yōu)先級(jí)反轉(zhuǎn),優(yōu)先級(jí)繼承以及優(yōu)先級(jí)天花板有了非常直觀的理解,在實(shí)際的項(xiàng)目中也能夠按照實(shí)際需求去選擇合適的機(jī)制。

最后提一點(diǎn),以上兩種方式都是緩解優(yōu)先級(jí)反轉(zhuǎn)帶來的影響,并不能解決,因?yàn)榈蛢?yōu)先級(jí)任務(wù)獲取到資源后高優(yōu)先級(jí)任務(wù)不可避免地要等待,否則就會(huì)造成更為致命的數(shù)據(jù)同步問題,上述解決方案都只是盡可能讓低優(yōu)先級(jí)任務(wù)更快速地處理完釋放資源從而讓高優(yōu)先級(jí)任務(wù)及時(shí)獲取。如果你的系統(tǒng)就不能接受這種情況,那么或許你要從程序設(shè)計(jì)角度,根本上去避免低優(yōu)先級(jí)任務(wù)與高優(yōu)先級(jí)任務(wù)共享資源,或是通過精密的設(shè)計(jì)規(guī)避高優(yōu)先級(jí)任務(wù)想要獲取資源時(shí)低優(yōu)先級(jí)任務(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)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5172

    文章

    19964

    瀏覽量

    324184
  • 調(diào)試器
    +關(guān)注

    關(guān)注

    1

    文章

    320

    瀏覽量

    24718
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1496

    瀏覽量

    43472
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    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 ?1753次閱讀

    深度剖析 RT-Thread 線程調(diào)度流程

    rt_system_scheduler_start:調(diào)度系統(tǒng)第一個(gè)線程rt_hw_context_switch_to:初始化上下文切換環(huán)境,觸發(fā)PendSV異常first_thread
    的頭像 發(fā)表于 06-25 18:24 ?1242次閱讀
    深度剖析 <b class='flag-5'>RT-Thread</b> 線程<b class='flag-5'>調(diào)度</b>流程

    請(qǐng)問UCOS如果把一個(gè)優(yōu)先級(jí)為5的任務(wù)刪除后,還能創(chuàng)建另一個(gè)優(yōu)先級(jí)為5的任務(wù)嗎?

    1,ucos 中不允許有相同優(yōu)先級(jí)任務(wù),如果把一個(gè)優(yōu)先級(jí)為5的任務(wù)刪除后,我還可以創(chuàng)建另一個(gè)優(yōu)先級(jí)為5的
    發(fā)表于 05-12 23:05

    干貨 | 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ā)表于 03-09 15:00

    RT-Thread與UCOS的簡(jiǎn)單比較

    一、RT-Thread與UCOS的簡(jiǎn)單比較任務(wù)或線程調(diào)度RT-Thread可選優(yōu)先級(jí)搶占式調(diào)度,
    發(fā)表于 08-20 06:00

    RT-Thread的內(nèi)核調(diào)度算法實(shí)現(xiàn)

    rt-thread調(diào)度算法為基于優(yōu)先級(jí)調(diào)度和基于時(shí)間片輪轉(zhuǎn)調(diào)度共存的策略。rt-thread內(nèi)
    發(fā)表于 04-20 11:54

    RT-Thread基于優(yōu)先級(jí)的全搶占式調(diào)度算法的實(shí)現(xiàn)

    一、原理概述RT-Thread 是一款嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS),同時(shí)也是一款優(yōu)秀的物聯(lián)網(wǎng)操作系統(tǒng),相對(duì)于裸機(jī)的輪詢調(diào)度算法,它使用的線程(任務(wù)調(diào)度算法是基于
    發(fā)表于 04-20 14:17

    探討一RT-Thread任務(wù)調(diào)度的啟動(dòng)順序

    ;amp;(thread->tlist));(f)調(diào)用rt_schedule進(jìn)行調(diào)度。首先需要做的就是查找當(dāng)前最高的優(yōu)先級(jí)RT-Thread
    發(fā)表于 05-09 14:13

    rt-thread優(yōu)先級(jí)的線程可以調(diào)度執(zhí)行嗎?

    請(qǐng)教下,在rt-thread中,如果低優(yōu)先級(jí)的線程中用while(1){}直接死循環(huán),是不是高優(yōu)先級(jí)的線程也無法調(diào)度執(zhí)行了?如果高優(yōu)先級(jí)的線
    發(fā)表于 05-13 10:51

    RT-Thread線程優(yōu)先級(jí)鏈表與位圖算法的介紹

    1 線程優(yōu)先級(jí)鏈表每個(gè)線程控制塊都帶有一個(gè)鏈表成員,根據(jù)優(yōu)先級(jí)thread->slist插入對(duì)相應(yīng)優(yōu)先級(jí)鏈表中,對(duì)于相同優(yōu)先級(jí)采取時(shí)間片輪
    發(fā)表于 05-13 15:38

    RT-Thread系統(tǒng)線程調(diào)度器的設(shè)計(jì)實(shí)現(xiàn)

    。RT-Thread內(nèi)核中也允許創(chuàng)建相同優(yōu)先級(jí)的線程。相同優(yōu)先級(jí)的線程采用時(shí)間片輪轉(zhuǎn)方式進(jìn)行調(diào)度(也就是通常說的分時(shí)調(diào)度器),時(shí)間片輪轉(zhuǎn)
    發(fā)表于 08-23 15:24

    如何去處理RT-Thread線程優(yōu)先級(jí)的問題呢

    RT-Thread優(yōu)先級(jí)問題,官方文檔互斥量一節(jié),線程2的優(yōu)先級(jí)比線程1高,但在線程2running的時(shí)候還是會(huì)被線程1搶占,達(dá)不到官方文檔的仿真運(yùn)行結(jié)果。下圖是我的仿真運(yùn)行結(jié)果,輸出打印
    發(fā)表于 12-05 11:51

    RT-Thread的互斥量優(yōu)先級(jí)問題求解

    優(yōu)先級(jí)最大值25,線程優(yōu)先級(jí)設(shè)置為21一25都可恢復(fù)正常功能,即高優(yōu)先級(jí)先運(yùn)行。源代碼如下:/*Copyright (c) 2006-2018, RT-Thread Developme
    發(fā)表于 12-09 15:43

    任務(wù)優(yōu)先級(jí)分配該遵循什么樣的原則?

    大家好!一直在做基于RT-Thread的多任務(wù)程序開發(fā),但是對(duì)于多任務(wù)優(yōu)先級(jí)該如何分配,并沒有太多的經(jīng)驗(yàn)。所以想問一大家,在進(jìn)行多
    發(fā)表于 02-10 14:14

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

    假設(shè)現(xiàn)在有三個(gè)任務(wù)TaskA(優(yōu)先級(jí)高)、TaskB(優(yōu)先級(jí)中)、TaskC(優(yōu)先級(jí)低),一個(gè)信號(hào)量(Semaphore),此信號(hào)量用于任務(wù)
    的頭像 發(fā)表于 04-24 13:01 ?3032次閱讀
    什么是<b class='flag-5'>優(yōu)先級(jí)</b><b class='flag-5'>反轉(zhuǎn)</b>