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

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

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

freeRTOS中空閑任務(wù)的作用

CHANBAEK ? 來源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-07-04 15:16 ? 次閱讀

嵌入式實時操作系統(tǒng)中,都會有空閑任務(wù)的存在,這個任務(wù)是伴隨著操作系統(tǒng)啟動之后而存在的。正常情況來說,系統(tǒng)不掛掉,空閑任務(wù)都會一直存在。

freeRTOS 調(diào)度器啟動時,自動創(chuàng)建空閑任務(wù),以確保系統(tǒng)中始終存在一個能夠運行的任務(wù)。 它是以最低優(yōu)先級創(chuàng)建,以確保如果有更高的優(yōu)先級的任務(wù)處于準備就緒狀態(tài),則空閑任務(wù)不使用任何 CPU 時間,讓渡出CPU的使用權(quán)給到更高優(yōu)先級的就緒任務(wù)去執(zhí)行。

freeRTOS中創(chuàng)建空閑任務(wù)的代碼如下:

xTaskCreate( prvIdleTask,
             configIDLE_TASK_NAME,
             configMINIMAL_STACK_SIZE,
             ( void * ) NULL,
             portPRIVILEGE_BIT,                                     
             &xIdleTaskHandle );

空閑任務(wù)的作用:

(1)釋放內(nèi)存

如果一個任務(wù)刪除另外的任務(wù),那個被刪除的任務(wù)的TCB塊和堆??臻g會被馬上釋放掉;

如果一個任務(wù)自己刪除了自己,那么這個刪除自身的任務(wù)的TCB塊和堆??臻g是由空閑任務(wù)進行回收的,空閑任務(wù)會去查詢有沒有自己刪除自己的任務(wù),如果有就會去回收這個任務(wù)的TCB塊和堆??臻g。如下:

圖片

(2)處理空閑優(yōu)先級任務(wù)

在freeRTOS中,如果使用搶占式的調(diào)度方式,具有相同優(yōu)先級的任務(wù)是通過時間片的方式獲取CPU使用權(quán)限的。通過時間片共享同一個優(yōu)先級的多個任務(wù),如果共享的優(yōu)先級大于空閑優(yōu)先級,并假設(shè)沒有更高優(yōu)先級的任務(wù),這些任務(wù)應(yīng)該獲得相同的處理器時間。

但是在空閑任務(wù)優(yōu)先級相同的情況下,這點是有些不同的。

如果有與空閑任務(wù)相同的優(yōu)先級的其他任務(wù),在宏 configIDLE_SHOULD_YIELD 為1時,空閑任務(wù)是不必等到時間片耗盡再進行任務(wù)切換的。意思是:時間片輪轉(zhuǎn)到空閑任務(wù)執(zhí)行時,如果這個時候檢查到還有其他的任務(wù)處于就緒狀態(tài),空閑任務(wù)就直接把cpu執(zhí)行權(quán)交給其他的任務(wù),而不需要等待空閑任務(wù)的時間片使用完。

當然,這種情況是需要滿足下面的條件才能夠?qū)崿F(xiàn)的:

1)系統(tǒng)調(diào)度方式使用的是搶占式的方式
2)有與空閑任務(wù)相同優(yōu)先級的其他任務(wù)
3)宏 configIDLE_SHOULD_YIELD 設(shè)置為 1

如下例所示:

假設(shè)有三個任務(wù)A、B、C,他們的任務(wù)優(yōu)先級與空閑任務(wù)I相同,并且宏 configIDLE_SHOULD_YIELD 為 1,那么任務(wù)A、B、C、I 的執(zhí)行如下圖演示:

圖片

假設(shè)上下文切換周期性的發(fā)生在T0、T1…T6時刻,當T2時刻是空閑任務(wù)執(zhí)行,然后發(fā)現(xiàn)任務(wù)A處于就緒,空閑任務(wù)I就會把cpu使用權(quán)讓給任務(wù)A。但是這個時候下,任務(wù)A執(zhí)行的時間片變短,因為空閑任務(wù)I占據(jù)了一部分的時間。這樣相比之下,任務(wù)A比任務(wù)B、C的執(zhí)行時間就變短了。

有什么辦法解決這個問題嗎?可以按照下面的方法考慮一下:

1)將跟空閑任務(wù)優(yōu)先級相同的其他任務(wù)使用空閑鉤子函數(shù)實現(xiàn);
2)用戶任務(wù)的任務(wù)優(yōu)先級大于空閑任務(wù)的優(yōu)先級;
3)設(shè)置 configIDLE_SHOULD_YIELD 為 0,不讓空閑任務(wù)讓出cpu使用權(quán);

(3)執(zhí)行空閑任務(wù)鉤子函數(shù)

空閑任務(wù)鉤本質(zhì)就是一個函數(shù),這個函數(shù)需要用戶去實現(xiàn),但是RTOS中規(guī)定了函數(shù)的名字和參數(shù)。如下:

voidvApplicationIdleHook(void);

這個鉤子函數(shù)在每個空閑任務(wù)周期都會被調(diào)用。

要使用這個鉤子函數(shù)的話,還需要再FreeRTOSConfig.h文件中將一個宏置 1,如下:

#define configUSE_IDLE_HOOK 1

特別要注意的是:空閑任務(wù)的鉤子函數(shù)里面不可以調(diào)用會引起阻塞的API,比如消息隊列、vTaskDelay()、消息郵箱、信號量之類的。

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

    關(guān)注

    5059

    文章

    18974

    瀏覽量

    302062
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10804

    瀏覽量

    210845
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2973

    瀏覽量

    73815
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6684

    瀏覽量

    123140
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61918
收藏 人收藏

    評論

    相關(guān)推薦

    FreeRTOS介紹與基礎(chǔ)任務(wù)創(chuàng)建

    本篇介紹FreeRTOS與基礎(chǔ)任務(wù)創(chuàng)建
    的頭像 發(fā)表于 09-26 09:00 ?2314次閱讀
    <b class='flag-5'>FreeRTOS</b>介紹與基礎(chǔ)<b class='flag-5'>任務(wù)</b>創(chuàng)建

    FreeRTOS中的任務(wù)管理

    任務(wù)FreeRTOS 中最基本的調(diào)度單元,它是一段可執(zhí)行的代碼,可以獨立運行。FreeRTOS 中的任務(wù)是基于優(yōu)先級的搶占式調(diào)度,優(yōu)先級高的任務(wù)
    的頭像 發(fā)表于 11-27 17:03 ?922次閱讀

    STM32__UCOSII系統(tǒng)啟動過程中空閑任務(wù)和統(tǒng)計任務(wù)扮演怎樣的角色?

    如題STM32__UCOSII系統(tǒng)啟動過程中空閑任務(wù)和統(tǒng)計任務(wù)扮演怎樣的角色
    發(fā)表于 05-08 07:37

    轉(zhuǎn):第10章 FreeRTOS任務(wù)管理

    10.8FreeRTOS任務(wù)刪除10.9FreeRTOS任務(wù)掛起10.10FreeRTOS任務(wù)
    發(fā)表于 08-23 09:54

    總線細胞陣列中空閑細胞冗余數(shù)量研究

    總線細胞陣列中空閑細胞冗余數(shù)量研究_王濤
    發(fā)表于 01-07 21:39 ?0次下載

    (一)FreeRTOS學(xué)習(xí)之FreeRTOS任務(wù)基礎(chǔ)知識

    FreeRTOS學(xué)習(xí)之FreeRTOS任務(wù)基礎(chǔ)知識轉(zhuǎn)行小白一枚,通過博客記錄自我學(xué)習(xí),望更多博友多多指點,感激不盡!RTOS系統(tǒng)的核心就是任務(wù)管理,學(xué)習(xí)RTOS系統(tǒng)主要是為了使用RTO
    發(fā)表于 12-23 19:57 ?3次下載
    (一)<b class='flag-5'>FreeRTOS</b>學(xué)習(xí)之<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>基礎(chǔ)知識

    FreeRTOS任務(wù)詳解

    詳細講解freeRTOS任務(wù)
    發(fā)表于 12-23 20:01 ?11次下載
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>任務(wù)</b>詳解

    FreeRTOS高級篇11---空閑任務(wù)分析

    當RTOS調(diào)度器開始工作后,為了保證至少有一個任務(wù)在運行,空閑任務(wù)被自動創(chuàng)建,占用最低優(yōu)先級(0優(yōu)先級)。
    發(fā)表于 01-26 17:30 ?0次下載
    <b class='flag-5'>FreeRTOS</b>高級篇11---<b class='flag-5'>空閑</b><b class='flag-5'>任務(wù)</b>分析

    FreeRTOS高級篇2---FreeRTOS任務(wù)創(chuàng)建分析

    FreeRTOS基礎(chǔ)系列《FreeRTOS系列第10篇---FreeRTOS任務(wù)創(chuàng)建和刪除》中介紹了任務(wù)創(chuàng)建API函數(shù)xTaskCreat
    發(fā)表于 01-26 17:42 ?23次下載
    <b class='flag-5'>FreeRTOS</b>高級篇2---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>創(chuàng)建分析

    FreeRTOS系列第11篇---FreeRTOS任務(wù)控制

    FreeRTOS任務(wù)控制API函數(shù)主要實現(xiàn)任務(wù)延時、任務(wù)掛起、解除任務(wù)掛起、任務(wù)優(yōu)先級獲取和設(shè)置
    發(fā)表于 01-26 17:54 ?12次下載
    <b class='flag-5'>FreeRTOS</b>系列第11篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>控制

    FreeRTOS系列第10篇---FreeRTOS任務(wù)創(chuàng)建和刪除

    FreeRTOS移植到Cortex-M3硬件平臺的文章中,我們已經(jīng)見過任務(wù)創(chuàng)建API,但那篇文章的重點在于如何移植FreeRTOS,本文將重點放在任務(wù)的...
    發(fā)表于 01-26 17:56 ?13次下載
    <b class='flag-5'>FreeRTOS</b>系列第10篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>創(chuàng)建和刪除

    freeRTOS任務(wù)

    freeRTOS系統(tǒng)的任務(wù)切換的具體過程最終都是在pendSV中斷服務(wù)函數(shù)里面完成的。
    的頭像 發(fā)表于 02-10 11:02 ?1507次閱讀
    <b class='flag-5'>freeRTOS</b>的<b class='flag-5'>任務(wù)</b>

    FreeRTOS中的空閑任務(wù)是什么

    任務(wù)就會開始運行,空閑任務(wù)最重要的作用就是讓處理器在無事可做的時候找點事做,防止處理器無聊,因此,空閑
    的頭像 發(fā)表于 07-30 10:55 ?1216次閱讀

    FreeRTOS空閑任務(wù)低功耗模式

    一次進入低功耗模式。T2、T3 和 T4 這三個時刻都一樣,反復(fù)的進入低功耗、退出低功耗,最理想的情況應(yīng)該是從 T1 時刻就進入低功耗,然后在 T5 時刻退出。 在(2)中空閑任務(wù)只工作了兩個時鐘節(jié)拍,但是也執(zhí)行了低功耗模式的進入和退出,顯
    的頭像 發(fā)表于 07-30 11:03 ?1131次閱讀

    FreeRTOS任務(wù)通知簡介

    任務(wù)通知簡介 任務(wù)通知在 FreeRTOS 中是一個可選的功能,要使用任務(wù)通知的話就需要將宏configUSE_TASK_NOTIFICATIONS 定義為 1。
    的頭像 發(fā)表于 07-30 11:34 ?710次閱讀