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

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

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

freeRTOS的任務(wù)

汽車電子技術(shù) ? 來(lái)源:嵌入式之入坑筆記 ? 作者:嵌入式之入坑筆記 ? 2023-02-10 11:02 ? 次閱讀

1、freeRTOS的任務(wù)

(1)任務(wù)的狀態(tài)

任務(wù)在運(yùn)行過(guò)程中,可能有以下幾種狀態(tài):

1)運(yùn)行態(tài)。任務(wù)當(dāng)前正在運(yùn)行中,占有cpu的使用權(quán)。

    2)就緒態(tài)。滿足了運(yùn)行條件,但是當(dāng)前沒(méi)有運(yùn)行,可能是有高優(yōu)先級(jí)任務(wù)在執(zhí)行或者在中斷,處于等待獲得cpu使用權(quán)然后運(yùn)行的狀態(tài)中。

    3)阻塞態(tài)。在某些條件下被阻塞了,不能得到運(yùn)行。比如等待某些信號(hào)量,消息隊(duì)列或者調(diào)用了延遲函數(shù)。

    4)掛起態(tài)。任務(wù)被通過(guò)調(diào)用掛起操作被終止執(zhí)行了,直到被從掛起狀態(tài)中恢復(fù)為止,否則將一直處于掛起的狀態(tài)中。

(2)任務(wù)的優(yōu)先級(jí)

freeRTOS的任務(wù)優(yōu)先級(jí)是數(shù)值越大,任務(wù)的優(yōu)先級(jí)越高。

freeRTOS 中任務(wù)的最高優(yōu)先級(jí)是通過(guò) **FreeRTOSConfig.h **文件中的

configMAX_PRIORITIES

進(jìn)行配置的,用戶實(shí)際可以使用的優(yōu)先級(jí)范圍是:

0 到 configMAX_PRIORITIES – 1

2、freeRTOS的任務(wù)切換的實(shí)現(xiàn)

(1)PendSV中斷

freeRTOS系統(tǒng)的任務(wù)切換的具體過(guò)程最終都是在pendSV中斷服務(wù)函數(shù)里面完成的。

** PendSV是一種不精確的異常處理,優(yōu)先級(jí)和掛起狀態(tài)可以通過(guò)編程實(shí)現(xiàn),一般在實(shí)時(shí)操作系統(tǒng)中PendSV**的優(yōu)先級(jí)都會(huì)被設(shè)置為最低,在其他所有的異常中斷處理完以后才執(zhí)行,對(duì)上下文的切換非常有用,在OS設(shè)計(jì)中也是屬于非常關(guān)鍵的。

在freeRTOS系統(tǒng)中,執(zhí)行上下文切換依靠的是任務(wù)調(diào)度器。上下文切換被觸發(fā)的場(chǎng)合可以有:

1> 執(zhí)行一個(gè)系統(tǒng)調(diào)用。如:任務(wù)切換函數(shù)taskYIELD()、延時(shí)vTaskDelay()。

2> Systick中斷。

(2)Systick中斷

** Systick**中斷服務(wù)函數(shù)中會(huì)進(jìn)行任務(wù)切換。

3、freeRTOS的任務(wù)管理的API函數(shù)

圖片

3.1、FreeRTOS任務(wù)創(chuàng)建

freeRTOS中,可以根據(jù)實(shí)際使用的需要?jiǎng)?chuàng)建一定數(shù)量的任務(wù)(線程),任務(wù)只有被成功創(chuàng)建了,才有可能被執(zhí)行到。

    在FreeRTOS實(shí)時(shí)操作系統(tǒng)中,創(chuàng)建任務(wù)可以使用如下的API
portBASE_TYPE xTaskCreate(
         pdTASK_CODE pvTaskCode,
         const char * const pcName,
         unsigned short usStackDepth,
         void *pvParameters,
         unsigned portBASE_TYPE uxPriority,
         xTaskHandle *pvCreatedTask
        );

函數(shù)參數(shù)說(shuō)明:
    pvTaskCode:指向任務(wù)入口函數(shù)的指針。即任務(wù)函數(shù)。
    pcName:任務(wù)的描述。一般都是為了調(diào)試方便而使用的。由 tskMAX_TASK_NAME_LEN 定義的最大長(zhǎng)度,默認(rèn)為 16。
    usStackDepth:任務(wù)堆棧的大小。不是字節(jié)數(shù)而是以字為單位。例如,如果堆棧為 16 位寬,并且 usStackDepth 定義為 100,則將分配 200 個(gè)字節(jié)用于堆棧存儲(chǔ)。
    pvParameters:任務(wù)的參數(shù)的指針。可以向創(chuàng)建的任務(wù)中傳入?yún)?shù),不需要傳送參數(shù)可以選NULL。
    uxPriority:任務(wù)運(yùn)行的優(yōu)先級(jí)。
    pvCreatedTask:任務(wù)的句柄,通過(guò)該句柄引用創(chuàng)建的任務(wù)。
返回值:
    任務(wù)創(chuàng)建成功返回 pdPASS;創(chuàng)建失敗返回 pdFAIL。

創(chuàng)建一個(gè)任務(wù)的示例如下:

xTaskCreate((TaskFunction_t )Start_Task,            //任務(wù)函數(shù)
            (const char*    )"Start_Task",          //任務(wù)名稱
            (uint16_t       )128,                   //任務(wù)堆棧大小
            (void *         )NULL,                  //傳遞給任務(wù)函數(shù)的參數(shù)
            (UBaseType_t    )5,                     //任務(wù)優(yōu)先級(jí)
            (TaskHandle_t * )&StartTask_Handler);   //任務(wù)句柄

注意:

任務(wù)的優(yōu)先級(jí)要根據(jù) **FreeRTOSConfig.h **文件中的

configMAX_PRIORITIES
進(jìn)行設(shè)置的,可以使用的優(yōu)先級(jí)范圍是 0 到 configMAX_PRIORITIES – 1,如果創(chuàng)建的任務(wù)所選的任務(wù)優(yōu)先級(jí)超過(guò)了這個(gè)設(shè)置的范圍,會(huì)被忽略掉,不會(huì)被執(zhí)行。

3.2、FreeRTOS任務(wù)掛起

當(dāng)任務(wù)在系統(tǒng)運(yùn)行過(guò)程中,因?yàn)槟承l件或者有其他的更加重要的事情要做的時(shí)候,可以考慮把某些任務(wù)先掛起,等候條件到達(dá)之后再恢復(fù)任務(wù)繼續(xù)調(diào)度運(yùn)行。

掛起任務(wù)的函數(shù)為:

void vTaskSuspend( xTaskHandle pxTaskToSuspend )
參數(shù):
    pxTaskToSuspend:需要被掛起的任務(wù)的優(yōu)先級(jí)
返回值:無(wú)
要使用這個(gè)函數(shù),需要在 FreeRTOSConfig.h中將宏定義 INCLUDE_vTaskSuspend 定義為 1,如下:

圖片

此外,如果要掛起、恢復(fù)整個(gè)系統(tǒng)所有的任務(wù),freeRTOS也提供了一個(gè)API函數(shù),如下:
void vTaskSuspendAll( void )    // 掛起所有的任務(wù)
BaseType_t xTaskResumeAll( void )  // 恢復(fù)所有被掛起的任務(wù)
要恢復(fù)某個(gè)被掛起的任務(wù),可以使用函數(shù):
void vTaskResume( xTaskHandle pxTaskToResume )
參數(shù):
    pxTaskToResume:任務(wù)的優(yōu)先級(jí)

3.3、FreeRTOS任務(wù)刪除

如果有某些任務(wù)只是需要存在于某些條件,當(dāng)條件滿足之后就不再需要這個(gè)任務(wù)參與運(yùn)行,這個(gè)時(shí)候可以選擇刪除掉這個(gè)任務(wù),釋放該任務(wù)所占用的堆??臻g。

    刪除任務(wù)可以使用函數(shù):
void vTaskDelete( xTaskHandle pxTask )
參數(shù):
pxTask:需要被刪除的任務(wù)句柄
返回值:無(wú)

注意:要使用這個(gè)函數(shù),需要將宏定義 INCLUDE_vTaskDelete 設(shè)置為 1 。

4、freeRTOS的內(nèi)核管理函數(shù)

圖片

4.1、獲取任務(wù)的優(yōu)先級(jí)

如果運(yùn)行過(guò)程中需要知道當(dāng)前運(yùn)行的任務(wù)的優(yōu)先級(jí),可以調(diào)用優(yōu)先級(jí)獲取函數(shù)得到任務(wù)的優(yōu)先級(jí):
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask )
 參數(shù):
     pxTask:需要獲取優(yōu)先級(jí)的任務(wù)的句柄。
 返回值:
     句柄對(duì)應(yīng)的任務(wù)的優(yōu)先級(jí)。

4.2、修改任務(wù)的優(yōu)先級(jí)

任務(wù)在運(yùn)行過(guò)程中,優(yōu)先級(jí)希望能被改變成其他的優(yōu)先級(jí),可以使用函數(shù):

void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority )
參數(shù):
      pxTask:任務(wù)的句柄。
       uxNewPriority:需要修改的新的優(yōu)先級(jí)的值。

5、freeRTOS的延時(shí)函數(shù)

5.1、相對(duì)延時(shí)函數(shù)

void vTaskDelay(const TickType_t TicksToDelay)

5.2、絕對(duì)延時(shí)函數(shù)

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61967
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61724
  • 中斷服務(wù)
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    6813
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    第10章FreeRTOS任務(wù)管理 對(duì)于初學(xué)者,特別是對(duì)于沒(méi)有RTOS基礎(chǔ)的同學(xué)來(lái)說(shuō),了解FreeRTOS任務(wù)管理非常重要,了解任務(wù)管理的目
    發(fā)表于 08-23 09:54

    STM32CUBE的freertos任務(wù)創(chuàng)建

    目錄問(wèn)題說(shuō)明解決步驟驗(yàn)證方案總結(jié)問(wèn)題說(shuō)明STM32CUBE的freertos任務(wù)創(chuàng)建十分簡(jiǎn)單方便,但卻有一個(gè)麻煩:需要我們把要跑的任務(wù)具體代碼都寫進(jìn)freertos.c的文件里面,對(duì)
    發(fā)表于 08-24 08:26

    有什么方法可以查看FreeRTOS任務(wù)的運(yùn)行狀態(tài)呢

    有什么方法可以查看FreeRTOS任務(wù)的運(yùn)行狀態(tài)呢?怎樣去查看FreeRTOS任務(wù)的運(yùn)行狀態(tài)呢?
    發(fā)表于 11-02 07:59

    淺析FreeRTOS任務(wù)系統(tǒng)

    FreeRTOS-任務(wù)基礎(chǔ)大多數(shù)時(shí)候,使用RTOS就是使用其多任務(wù)處理功能。所謂多任務(wù)處理,其實(shí)并不是我們移植了RTOS系統(tǒng)后,CPU就可以同時(shí)處理多個(gè)
    發(fā)表于 01-06 08:08

    FreeRTOS任務(wù)通知相關(guān)資料分享

    FreeRTOS--任務(wù)通知Notification今天發(fā)現(xiàn)了一個(gè)奇怪的現(xiàn)象,特意把它記錄下來(lái),防止忘記了。先上圖于是找了所有的任務(wù)句柄,真的是沒(méi)有操作掛起了這個(gè)任務(wù)。但是程序還是運(yùn)行
    發(fā)表于 01-21 12:07

    對(duì)FreeRTOS任務(wù)的使用

    FreeRTOS學(xué)習(xí)筆記(二):任務(wù)創(chuàng)建/刪除,掛起/解掛上篇文章介紹了任務(wù)相關(guān)的基礎(chǔ)知識(shí),本篇文章對(duì)FreeRTOS任務(wù)的使用,將會(huì)介紹
    發(fā)表于 02-18 07:14

    詳細(xì)講解freeRTOS任務(wù)

    詳細(xì)講解freeRTOS任務(wù)
    發(fā)表于 02-18 06:57

    FreeRTOS任務(wù)創(chuàng)建到閃存LED的基本應(yīng)用程序

    應(yīng)用程序 : 本代碼是 FreeRTOS 任務(wù)的基本應(yīng)用程序, 用于創(chuàng)建閃存 LED 任務(wù) 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件
    發(fā)表于 08-22 06:28

    如何輕松幾步實(shí)現(xiàn)在STM32上運(yùn)行FreeRTOS任務(wù)

    輕松幾步實(shí)現(xiàn)在STM32上運(yùn)行FreeRTOS任務(wù)
    的頭像 發(fā)表于 03-01 12:07 ?8307次閱讀
    如何輕松幾步實(shí)現(xiàn)在STM32上運(yùn)行<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>

    FreeRTOS任務(wù)控制API函數(shù)介紹

    FreeRTOS任務(wù)控制API函數(shù)主要實(shí)現(xiàn)任務(wù)延時(shí)、任務(wù)掛起、解除任務(wù)掛起、任務(wù)優(yōu)先級(jí)獲取和設(shè)置
    的頭像 發(fā)表于 03-19 10:19 ?2185次閱讀

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

    FreeRTOS學(xué)習(xí)之FreeRTOS任務(wù)基礎(chǔ)知識(shí)轉(zhuǎn)行小白一枚,通過(guò)博客記錄自我學(xué)習(xí),望更多博友多多指點(diǎn),感激不盡!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ǔ)知識(shí)

    FreeRTOS任務(wù)詳解

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

    FreeRTOS高級(jí)篇4---FreeRTOS任務(wù)切換分析

    FreeRTOS任務(wù)相關(guān)的代碼大約占總代碼的一半左右,這些代碼都在為一件事情而努力,即找到優(yōu)先級(jí)最高的就緒任務(wù),并使之獲得CPU運(yùn)行權(quán)。任...
    發(fā)表于 01-26 17:41 ?12次下載
    <b class='flag-5'>FreeRTOS</b>高級(jí)篇4---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>切換分析

    FreeRTOS高級(jí)篇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>高級(jí)篇2---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>創(chuàng)建分析

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

    FreeRTOS任務(wù)控制API函數(shù)主要實(shí)現(xiàn)任務(wù)延時(shí)、任務(wù)掛起、解除任務(wù)掛起、任務(wù)優(yōu)先級(jí)獲取和設(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>控制