RM新时代网站-首页

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

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

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

淺析FreeRTOS任務(wù)調(diào)度器的三種調(diào)度算法和應(yīng)用

麥克泰技術(shù) ? 來源:瑞薩嵌入式小百科 ? 2024-05-10 14:02 ? 次閱讀

FreeRTOSMCU領(lǐng)域應(yīng)用非常廣泛,今天就給大家講解一下FreeRTOS調(diào)度器中的三種調(diào)度算法,以及在瑞薩RZ/T2L MPU中的應(yīng)用。

1.任務(wù)狀態(tài)和事件的概述

RTOS,即實時操作系統(tǒng),是一種能夠在規(guī)定時間內(nèi)響應(yīng)外部事件或數(shù)據(jù),并控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)做出快速響應(yīng)的操作系統(tǒng)。RTOS通過調(diào)度一切可利用的資源完成實時任務(wù),并控制所有實時任務(wù)協(xié)調(diào)一致運(yùn)行。RTOS的主要特點包括提供及時響應(yīng)和高可靠性。

在RTOS中,任務(wù)狀態(tài)通常包括以下幾種:

就緒態(tài)(Ready):任務(wù)已經(jīng)準(zhǔn)備好執(zhí)行,所有必要資源都已經(jīng)準(zhǔn)備就緒,只等待RTOS調(diào)度器選中并分配CPU時間。新創(chuàng)建的任務(wù)通常立即進(jìn)入就緒狀態(tài),等待調(diào)度器的調(diào)度。

運(yùn)行態(tài)(Running):任務(wù)正在執(zhí)行,占據(jù)了CPU資源。當(dāng)任務(wù)被RTOS調(diào)度器選中后,其上下文會被加載到CPU寄存器中,開始執(zhí)行任務(wù)代碼。

阻塞態(tài)(Blocked):任務(wù)暫時不能執(zhí)行,通常是因為等待某些外部事件,如I/O操作完成、定時器到期、信號量或互斥量被釋放等。一旦這些事件發(fā)生,任務(wù)會重新進(jìn)入就緒狀態(tài),等待調(diào)度器的調(diào)度。

掛起態(tài)(Suspended):任務(wù)被主動掛起,不參與調(diào)度,需要手動恢復(fù)才能回到就緒態(tài)。掛起狀態(tài)的任務(wù)不會執(zhí)行,直到被其他任務(wù)或中斷調(diào)用特定的API函數(shù)恢復(fù)。

RTOS中的事件是指能夠觸發(fā)任務(wù)狀態(tài)改變或任務(wù)執(zhí)行的某些外部或內(nèi)部發(fā)生的情況。事件可以是來自硬件的中斷、定時器到期、消息隊列中的消息到達(dá)等。RTOS通過事件來同步和協(xié)調(diào)任務(wù)的執(zhí)行,確保它們能夠按照預(yù)期的方式和時間順序運(yùn)行。

2.FreeRTOS調(diào)度算法

FreeRTOS它支持多種任務(wù)調(diào)度算法,可通過配置來滿足不同應(yīng)用的需求。

通過配置 configUSE_PREEMPTION 和 configUSE_TIME_SLICING 來更改算法。這兩個常量都在FreeRTOSConfig.h中定義。

還有個配置常數(shù)configUSE_TICKLESS_IDLE也會影響調(diào)度算法,因為使用它會導(dǎo)致tick中斷在很長一段時間內(nèi)被完全關(guān)閉。

configUSE_TICKLESS_IDLE是一個高級選項,專門用于必須最小化功耗的應(yīng)用程序。configUSE_TICKLESS_IDLE在之后解說。

對于相同優(yōu)先級的任務(wù),F(xiàn)reeRTOS調(diào)度器依次選中相同優(yōu)先級的任務(wù)進(jìn)入運(yùn)行態(tài)。這種輪流策略被稱為‘Round Robin Scheduling’

‘Round Robin Scheduling’算法并不能保證同等優(yōu)先級的任務(wù)之間運(yùn)行相同的時間,只能保證同等優(yōu)先級的“就緒”任務(wù)會依次進(jìn)入“運(yùn)行”態(tài)。

2.1

基于時間片的搶占式調(diào)度

如果按照如下配置:

configUSE_PREEMPTION 1

configUSE_TIME_SLICING 1

FreeRTOS調(diào)度器使用一種稱為“基于時間片的固定優(yōu)先級搶占式調(diào)度”的調(diào)度算法,這是大多數(shù)小型RTOS應(yīng)用程序使用的調(diào)度算法。

固定優(yōu)先級

被描述為“固定優(yōu)先級”的調(diào)度算法不會改變分配給被調(diào)度任務(wù)的優(yōu)先級,但也不會阻止任務(wù)本身改變自己的優(yōu)先級或其他任務(wù)的優(yōu)先級。

搶占式調(diào)度

在優(yōu)先級高于運(yùn)行態(tài)任務(wù)的任務(wù)進(jìn)入就緒態(tài)時,調(diào)度器立即讓這個高優(yōu)先級的任務(wù)“搶占”運(yùn)行態(tài)任務(wù)。被搶占意味著任務(wù)移出運(yùn)行態(tài)并進(jìn)入就緒態(tài),并不是因為任務(wù)自己主動讓出或者阻塞。

時間片

時間片用于在具有相同優(yōu)先級的任務(wù)之間共享處理時間,即使任務(wù)沒有顯式地讓步或進(jìn)入阻塞狀態(tài)。使用“時間片”的調(diào)度算法將在每個時間片結(jié)束時選擇一個新任務(wù)進(jìn)入運(yùn)行狀態(tài),如果有其他與運(yùn)行任務(wù)具有相同優(yōu)先級的就緒狀態(tài)任務(wù)。一個時間片等于兩個RTOS tick中斷之間的時間。

1d84ada4-0e8f-11ef-a297-92fbcf53809c.png

上圖演示了使用“基于時間片的固定優(yōu)先級搶占式調(diào)度”算法搶占調(diào)度任務(wù)的調(diào)度過程。

task1是最高優(yōu)先級的事件驅(qū)動任務(wù),task2是中等優(yōu)先級的周期性任務(wù),task3是最低優(yōu)先級的事件驅(qū)動任務(wù),Idle task是空閑任務(wù)。

task1周期性運(yùn)行,阻塞時,空閑任務(wù)就會運(yùn)行,task3的事件到達(dá)就會搶占空閑任務(wù),task3運(yùn)行期間,如果task2的周期到了,因為task2優(yōu)先級高就會搶占task3,task2運(yùn)行完了再接著運(yùn)行task2,task2運(yùn)行期間,由于task1優(yōu)先級高,一旦task1等待的事件到了就會搶占task2。

有相同優(yōu)先級任務(wù)的情況:

1df85218-0e8f-11ef-a297-92fbcf53809c.png

task1是優(yōu)先級最高的事件驅(qū)動任務(wù),task2是和Idle task優(yōu)先級相同的持續(xù)處理型任務(wù)。

task2和空閑任務(wù)就會輪流運(yùn)行,而task1則可以搶占task2和空閑任務(wù)。

假如空閑任務(wù)里其實沒做什么事情,我們想讓和空閑任務(wù)相同優(yōu)先級的Task2有更多的運(yùn)行時間就可以配置configIDLE_SHOULD_YIELD。

如果configIDLE_SHOULD_YIELD設(shè)置為0,那么空閑任務(wù)將在整個時間片中保持運(yùn)行狀態(tài),除非它被更高優(yōu)先級的任務(wù)搶占。

如果configIDLE_SHOULD_YIELD設(shè)置為1,如果有其他空閑優(yōu)先級任務(wù)處于就緒狀態(tài),那么空閑任務(wù)將主動讓出運(yùn)行時間。

1e4e355c-0e8f-11ef-a297-92fbcf53809c.png

2.2

不帶時間片的搶占式調(diào)度

配置如下時,調(diào)度算法就會變成不帶時間片的搶占式調(diào)度

configUSE_PREEMPTION 1

configUSE_TIME_SLICING 0

和前面的唯一區(qū)別就是相同優(yōu)先級的任務(wù)之間不會隨時間自動切換。

如果不使用時間片,那么調(diào)度程序只會在發(fā)生這兩種情況時,進(jìn)行任務(wù)切換:

1

優(yōu)先級更高的任務(wù)進(jìn)入“就緒”態(tài)。

2

運(yùn)行態(tài)任務(wù)變?yōu)樽枞麘B(tài)或被掛起。

很顯然,不使用時間片時,任務(wù)切換的情況會變少,所以關(guān)閉時間切片可以減少調(diào)度器的處理開銷。但是關(guān)閉時間切片也可能導(dǎo)致具有相同優(yōu)先級的任務(wù)獲得的處理時間相差很大。因此,一定要慎重使用。

1ebb89ae-0e8f-11ef-a297-92fbcf53809c.png

task1為最高優(yōu)先級的事件驅(qū)動任務(wù),task2和Idle task有相同的優(yōu)先級。但是由于關(guān)閉了時間片,任務(wù)切換只會在空閑任務(wù)阻塞或者掛起或者task1搶占后發(fā)生,所以空閑任務(wù)和task2雖然優(yōu)先級相同,但是明顯空閑任務(wù)占有的時間長很多。

2.3

協(xié)同調(diào)度

configUSE_PREEMPTION 0

configUSE_TIME_SLICINGx

當(dāng)使用協(xié)同調(diào)度時,只有當(dāng)運(yùn)行態(tài)任務(wù)進(jìn)入阻塞態(tài),或者運(yùn)行態(tài)任務(wù)通過調(diào)用taskYIELD()主動讓出,才會發(fā)生任務(wù)切換。

任務(wù)永遠(yuǎn)不會被搶占,不能使用時間片,時間片配置的值隨便,無所謂。

1f2bc23c-0e8f-11ef-a297-92fbcf53809c.png

task1、2、3優(yōu)先級依次變低,剛開始task3運(yùn)行,雖然task1和2優(yōu)先級高,并且沒有阻塞,但是也無法搶占,task3調(diào)用taskYIELD(),主動讓出,因為task1優(yōu)先級比task2高,task1就運(yùn)行了,task1運(yùn)行夠了進(jìn)入阻塞態(tài),由于task2比task3優(yōu)先級高,task2就運(yùn)行了。

在RZ/T2L上做的實驗

如果兩個參數(shù)設(shè)置為:configUSE_PREEMPTION =0,configUSE_TIME_SLICING= 0或者1(隨便) 稱之為協(xié)同調(diào)度,當(dāng)使用協(xié)同調(diào)度時,只有當(dāng)運(yùn)行態(tài)任務(wù)進(jìn)入阻塞態(tài),或者運(yùn)行態(tài)任務(wù)通過調(diào)用taskYIELD()主動讓出,才會發(fā)生任務(wù)切換。

任務(wù)永遠(yuǎn)不會被搶占,不能使用時間片,時間片配置的值隨便。我做了一個實驗截圖如下:

1f8d8ee0-0e8f-11ef-a297-92fbcf53809c.png

200306ac-0e8f-11ef-a297-92fbcf53809c.png

上面的實驗說明“只有當(dāng)運(yùn)行態(tài)任務(wù)進(jìn)入阻塞態(tài),或者運(yùn)行態(tài)任務(wù)通過調(diào)用taskYIELD()主動讓出,才會發(fā)生任務(wù)切換”,此時與時間片1 ms已經(jīng)沒有什么關(guān)系了。

如果兩個參數(shù)設(shè)置為 configUSE_PREEMPTION =1,configUSE_TIME_SLICING=1, 此時只有兩個任務(wù)并且優(yōu)先級相同,每個任務(wù)都持續(xù)做一件事就會出現(xiàn)時間征為1ms的輪轉(zhuǎn)情況:

2065d73c-0e8f-11ef-a297-92fbcf53809c.png

20d1008e-0e8f-11ef-a297-92fbcf53809c.png

通過上面的兩個實驗可以說明,時間片存的意義是相同優(yōu)先級并且持續(xù)時間較長的處理任務(wù),需要平等分享CPU使用權(quán)。但是如果一旦有一方主動放棄CPU或者阻塞或者更高優(yōu)先級任務(wù)來了,調(diào)度器是不會等待一個時間片完全結(jié)束,再去調(diào)度就緒列表中的任務(wù)的,而是直接調(diào)用就緒列表里的第一個任務(wù)。這樣的設(shè)計我認(rèn)為是合理的,如果一定要等待時間片結(jié)束,是存在嚴(yán)重的資源浪費(fèi)的。



審核編輯:劉清

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

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120224
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3246

    瀏覽量

    114714
  • 中斷處理
    +關(guān)注

    關(guān)注

    0

    文章

    94

    瀏覽量

    10967
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62136
  • 調(diào)度算法
    +關(guān)注

    關(guān)注

    1

    文章

    68

    瀏覽量

    11977
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

    5245

原文標(biāo)題:熱文分享| FreeRTOS任務(wù)調(diào)度器的三種調(diào)度算法和應(yīng)用

文章出處:【微信號:麥克泰技術(shù),微信公眾號:麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FreeRTOS任務(wù)調(diào)度三種調(diào)度算法講解(下)

    配置如下時,調(diào)度算法就會變成不帶時間片的搶占式調(diào)度
    的頭像 發(fā)表于 03-21 13:46 ?2757次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b><b class='flag-5'>調(diào)度</b><b class='flag-5'>器</b>的<b class='flag-5'>三種</b><b class='flag-5'>調(diào)度</b><b class='flag-5'>算法</b>講解(下)

    轉(zhuǎn):第14章 任務(wù)調(diào)度—搶占式,時間片和合作式

    調(diào)度方式FreeRTOS操作系統(tǒng)支持三種調(diào)度方式:搶占式調(diào)度,時間片調(diào)度和合作式
    發(fā)表于 08-30 09:55

    轉(zhuǎn)第16章 FreeRTOS調(diào)度鎖,任務(wù)鎖和中斷鎖

    任務(wù)鎖函數(shù),但是使用FreeRTOS現(xiàn)有的功能有兩實現(xiàn)方法:(1)通過給調(diào)度加鎖實現(xiàn)利用FreeR
    發(fā)表于 09-01 07:45

    FreeRTOS如何使用delay作為系統(tǒng)延時、任務(wù)調(diào)度

    請教一個問題,最近在學(xué)習(xí)使用FreeRTOS,想像原子一樣在delay.c里添加RTOS的系統(tǒng)支持,即使用tick時鐘作延時。現(xiàn)在有幾個問題:1、在啟動任務(wù)調(diào)度前,如果調(diào)用了dela
    發(fā)表于 06-10 04:37

    請問FreeRTOS是如何實現(xiàn)調(diào)度的?

    最近入門RTOS,首先看書了解了合作式調(diào)度的應(yīng)用,其基本思想是在主循環(huán)中不斷執(zhí)行調(diào)度函數(shù),在SysTick中斷中更新任務(wù)狀態(tài),程序我也大致看懂了。之后到了入門
    發(fā)表于 07-30 07:40

    調(diào)度的原理及其任務(wù)調(diào)度代碼實現(xiàn)

    一、介紹調(diào)度是常用的一編程框架,也是操作系統(tǒng)的拆分多任務(wù)的核心,比如單片機(jī)的裸機(jī)程序框架,網(wǎng)絡(luò)協(xié)議棧的框架如can網(wǎng)關(guān)、485網(wǎng)關(guān)等等,使用場合比較多,是做穩(wěn)定產(chǎn)品比較常用的編程技
    發(fā)表于 02-17 07:07

    基于實數(shù)編碼免疫算法的分布式任務(wù)調(diào)度

    任務(wù)調(diào)度問題是一個NP難題,其算法是一個重要研究方向。該文通過對任務(wù)調(diào)度模型及已有免疫算法進(jìn)行研
    發(fā)表于 04-08 09:00 ?15次下載

    網(wǎng)格任務(wù)調(diào)度算法研究

    網(wǎng)格任務(wù)調(diào)度算法是影響網(wǎng)格成功與否的關(guān)鍵技術(shù)之一。本文總結(jié)了網(wǎng)格計算系統(tǒng)的體系結(jié)構(gòu)和特征,分析了網(wǎng)格任務(wù)調(diào)度
    發(fā)表于 08-14 10:27 ?10次下載

    任務(wù)閾值調(diào)度算法

    針對當(dāng)前云任務(wù)調(diào)度算法在密碼云環(huán)境中無法實現(xiàn)任務(wù)實時處理的問題,提出一基于滾動優(yōu)化窗口的實時閾值調(diào)度
    發(fā)表于 11-24 17:08 ?5次下載
    云<b class='flag-5'>任務(wù)</b>閾值<b class='flag-5'>調(diào)度</b><b class='flag-5'>算法</b>

    基于云計算遺傳算法的多任務(wù)調(diào)度算法

    任務(wù)調(diào)度是云計算中的一個關(guān)鍵問題,遺傳算法是一能較好解決優(yōu)化問題的算法。本論文針對遺傳算法
    發(fā)表于 12-07 15:16 ?0次下載

    基于改進(jìn)GEP的局部云任務(wù)調(diào)度算法

    針對云計算中一些現(xiàn)有的基于批量調(diào)度模式和進(jìn)化算法的動態(tài)云任務(wù)調(diào)度算法計算量較大,計算時間成本較高的現(xiàn)象,提出了一
    發(fā)表于 01-18 13:50 ?0次下載
    基于改進(jìn)GEP的局部云<b class='flag-5'>任務(wù)</b><b class='flag-5'>調(diào)度</b><b class='flag-5'>算法</b>

    異構(gòu)多核處理任務(wù)調(diào)度算法

    任務(wù)調(diào)度響應(yīng)實時性方面表現(xiàn)優(yōu)異,但卻不適用于異構(gòu)多核處理環(huán)境。為此,提出一高實時性任務(wù)調(diào)度
    發(fā)表于 02-07 11:07 ?2次下載

    FreeRTOS時間片調(diào)度

    一、FreeRTOS時間片調(diào)度概述FreeRTOS支持多個任務(wù)同時擁有一個優(yōu)先級,這些任務(wù)調(diào)度
    發(fā)表于 12-23 19:57 ?1次下載
    <b class='flag-5'>FreeRTOS</b>時間片<b class='flag-5'>調(diào)度</b>

    FreeRTOS時間片進(jìn)行任務(wù)調(diào)度?

    CPU的使用權(quán),讓擁有同優(yōu)先級的下一個任務(wù)運(yùn)行, 至于下一個要運(yùn)行哪個任務(wù)? 由時間片來調(diào)度,時間片調(diào)度發(fā)生在滴答定時的中斷服務(wù)函數(shù)中 。
    發(fā)表于 12-23 20:02 ?0次下載
    <b class='flag-5'>FreeRTOS</b>時間片進(jìn)行<b class='flag-5'>任務(wù)</b><b class='flag-5'>調(diào)度</b>?

    FreeRTOS調(diào)度中的三種調(diào)度算法實踐(上)

    在優(yōu)先級高于運(yùn)行態(tài)任務(wù)任務(wù)進(jìn)入就緒態(tài)時,調(diào)度立即讓這個高優(yōu)先級的任務(wù)“搶占”運(yùn)行態(tài)任務(wù)。被搶
    發(fā)表于 03-21 13:45 ?501次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>調(diào)度</b><b class='flag-5'>器</b>中的<b class='flag-5'>三種</b><b class='flag-5'>調(diào)度</b><b class='flag-5'>算法</b>實踐(上)
    RM新时代网站-首页