0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

FreeRTOS中的任務管理

CHANBAEK ? 來源: FunIO ? 作者: FunIO ? 2023-11-27 17:03 ? 次閱讀

任務概述

任務是 FreeRTOS 中最基本的調(diào)度單元,它是一段可執(zhí)行的代碼,可以獨立運行。FreeRTOS 中的任務是基于優(yōu)先級的搶占式調(diào)度,優(yōu)先級高的任務可以搶占優(yōu)先級低的任務的 CPU 資源。任務的創(chuàng)建、刪除、掛起、恢復、設置優(yōu)先級等操作都是通過調(diào)用 API 函數(shù)來實現(xiàn)的。

任務的創(chuàng)建

任務的創(chuàng)建是通過調(diào)用 xTaskCreate 函數(shù)來實現(xiàn)的,函數(shù)原型如下:

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                        const char * const pcName,
                        const configSTACK_DEPTH_TYPE usStackDepth,
                        void * const pvParameters,
                        UBaseType_t uxPriority,
                        TaskHandle_t * const pxCreatedTask );

參數(shù)說明:

  • pxTaskCode:任務函數(shù)的入口地址。
  • pcName:任務的名字,用于調(diào)試。
  • usStackDepth:任務棧的大小,單位為字。
  • pvParameters:傳遞給任務函數(shù)的參數(shù)。
  • uxPriority:任務的優(yōu)先級。
  • pxCreatedTask:任務創(chuàng)建成功后,返回任務句柄。

任務的刪除

任務的刪除是通過調(diào)用 vTaskDelete 函數(shù)來實現(xiàn)的,函數(shù)原型如下:

void vTaskDelete( TaskHandle_t xTask );

參數(shù)說明:

  • xTask:任務句柄。

任務的掛起和恢復

任務的掛起和恢復是通過調(diào)用 vTaskSuspendxTaskResume 函數(shù)來實現(xiàn)的,函數(shù)原型如下:

void vTaskSuspend( TaskHandle_t xTaskToSuspend );
BaseType_t xTaskResume( TaskHandle_t xTaskToResume );

參數(shù)說明:

  • xTaskToSuspend:掛起任務句柄。
  • xTaskToResume:恢復任務句柄。

任務的優(yōu)先級

任務的優(yōu)先級是通過調(diào)用 vTaskPrioritySetxTaskPriorityGet 函數(shù)來實現(xiàn)的,函數(shù)原型如下:

void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
UBaseType_t xTaskPriorityGet( TaskHandle_t xTask, BaseType_t * pxPreviousPriority );

參數(shù)說明:

  • xTask:任務句柄。
  • uxNewPriority:新的優(yōu)先級。
  • pxPreviousPriority:保存原來的優(yōu)先級。

注意: 在 FreeRTOS 中,優(yōu)先級數(shù)值越大,優(yōu)先級越高,任務的優(yōu)先級不能超過 configMAX_PRIORITIES 宏定義的值。

任務的延時

任務的延時是通過調(diào)用 vTaskDelay 函數(shù)來實現(xiàn)的,函數(shù)原型如下:

void vTaskDelay( const TickType_t xTicksToDelay );

參數(shù)說明:

  • xTicksToDelay:延時時間,單位為時鐘節(jié)拍。

任務的阻塞

任務的阻塞是通過調(diào)用 vTaskDelayUntil 函數(shù)來實現(xiàn)的,函數(shù)原型如下:

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );

參數(shù)說明:

  • pxPreviousWakeTime:保存上一次喚醒的時間。
  • xTimeIncrement:下一次喚醒的時間增量。

任務的阻塞和喚醒

任務的阻塞和喚醒是通過調(diào)用 xTaskNotifyWaitxTaskNotify 函數(shù)來實現(xiàn)的,函數(shù)原型如下:

UBaseType_t xTaskNotifyWait( UBaseType_t uxBitsToClearOnEntry, UBaseType_t uxBitsToClearOnExit, uint32_t * pulNotificationValue, TickType_t xTicksToWait );
BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, UBaseType_t uxTaskPriority, uint32_t ulValue, eNotifyAction eAction );

參數(shù)說明:

  • uxBitsToClearOnEntry:在任務進入阻塞前,需要清除的任務通知位。
  • uxBitsToClearOnExit:在任務退出阻塞前,需要清除的任務通知位。
  • pulNotificationValue:保存任務通知值。
  • xTicksToWait:阻塞時間。
  • xTaskToNotify:需要通知的任務句柄。
  • uxTaskPriority:需要通知的任務優(yōu)先級。
  • ulValue:需要通知的任務通知值。

Playground

創(chuàng)建任務

創(chuàng)建 2 個優(yōu)先級都是1的任務.

#include < freertos/FreeRTOS.h >
#include < freertos/task.h >
#include < stdio.h >

// 任務1的函數(shù)
void task1(void *pvParameter) {
    while (1) {
        printf("這是任務1n");
        vTaskDelay(1000 / portTICK_PERIOD_MS);  // 1秒的延遲
    }
}

// 任務2的函數(shù)
void task2(void *pvParameter) {
    while (1) {
        printf("這是任務2n");
        vTaskDelay(2000 / portTICK_PERIOD_MS);  // 2秒的延遲
    }
}

void app_main() {
    // 創(chuàng)建任務1
    xTaskCreate(task1, "task1", 2048, NULL, 1, NULL);

    // 創(chuàng)建任務2
    xTaskCreate(task2, "task2", 2048, NULL, 1, NULL);
}

運行一下,輸出:

這是任務1
這是任務1
這是任務2
這是任務1
這是任務1
這是任務2
這是任務1
這是任務1
這是任務2
這是任務1
這是任務1
這是任務2
...

我們稍加修改,將任務 1 中的任務延時去掉,看看任務 1 會不獨占 CPU 資源:

#include < freertos/FreeRTOS.h >
#include < freertos/task.h >
#include < stdio.h >

// 任務1的函數(shù)
void task1(void *pvParameter) {
    while (1) {
    }
}

// 任務2的函數(shù)
void task2(void *pvParameter) {
    while (1) {
        printf("這是任務2n");
        vTaskDelay(2000 / portTICK_PERIOD_MS);  // 2秒的延遲
    }
}

void app_main() {
    // 創(chuàng)建任務1
    xTaskCreate(task1, "task1", 2048, NULL, 2, NULL);

    // 創(chuàng)建任務2
    xTaskCreate(task2, "task2", 2048, NULL, 1, NULL);
}

運行一下,輸出:

這是任務2
這是任務2
E (5509) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:
E (5509) task_wdt:  - IDLE (CPU 0)
E (5509) task_wdt: Tasks currently running:
E (5509) task_wdt: CPU 0: task1
E (5509) task_wdt: Print CPU 0 (current core) registers
Core  0 register dump:
MEPC    : 0x42007356  RA      : 0x40385920  SP      : 0x3fc90a50  GP      : 0x3fc8b000
0x42007356: task1 at C:/Users/Peter/Desktop/udp_server/main/udp_server.c:7 (discriminator 1)

0x40385920: vPortTaskWrapper at C:/Users/Peter/esp/esp-idf/components/freertos/FreeRTOS-Kernel/portable/riscv/port.c:205

TP      : 0x3fc88554  T0      : 0x00000000  T1      : 0x00000000  T2      : 0x00000000
S0/FP   : 0x00000000  S1      : 0x00000000  A0      : 0x00000000  A1      : 0x00000000
A2      : 0x00000000  A3      : 0x00000000  A4      : 0x00000000  A5      : 0x42007356
0x42007356: task1 at C:/Users/Peter/Desktop/udp_server/main/udp_server.c:7 (discriminator 1)

A6      : 0x00000000  A7      : 0x00000000  S2      : 0x00000000  S3      : 0x00000000
S4      : 0x00000000  S5      : 0x00000000  S6      : 0x00000000  S7      : 0x00000000
S8      : 0x00000000  S9      : 0x00000000  S10     : 0x00000000  S11     : 0x00000000
T3      : 0x00000000  T4      : 0x00000000  T5      : 0x00000000  T6      : 0x00000000
MSTATUS : 0x00000000  MTVEC   : 0x00000000  MCAUSE  : 0x00000000  MTVAL   : 0x00000000
MHARTID : 0x00000000
這是任務2
這是任務2
...

可以看到,相同優(yōu)先級的任務 2 依然可以正常運行,而任務 1 則觸發(fā)了看門狗。兩個任務按照時間片輪轉(zhuǎn)的方式共享 CPU 資源??梢韵胍姡绻蝿?1 的優(yōu)先級比任務 2 高,那么任務 1 就會獨占 CPU 資源,任務 2 就無法運行了。

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

    關(guān)注

    68

    文章

    11015

    瀏覽量

    215400
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1556

    瀏覽量

    63356
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4365

    瀏覽量

    63940
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4882

    瀏覽量

    70090
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    485

    瀏覽量

    63584
收藏 0人收藏

    評論

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

    FreeRTOS介紹與基礎任務創(chuàng)建

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

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

    第10章FreeRTOS任務管理 對于初學者,特別是對于沒有RTOS基礎的同學來說,了解FreeRTOS任務
    發(fā)表于 08-23 09:54

    梳理一下FreeRTOS任務管理單元實現(xiàn)思路

    關(guān)注、星標嵌入式客棧,精彩及時送達[導讀] 學習梳理一下FreeRTOS任務管理單元實現(xiàn)思路,代碼分析基于V10.4.3。從本文開始計劃寫個圖解freeRTOS內(nèi)核系列筆記分享給朋友們
    發(fā)表于 01-13 07:08

    FreeRTOS任務如何創(chuàng)建和刪除?

    FreeRTOS移植到Cortex-M3硬件平臺的文章,我們已經(jīng)見過任務創(chuàng)建API,但那篇文章的重點在于如何移植FreeRTOS,本文將重點放在
    的頭像 發(fā)表于 03-11 18:08 ?3129次閱讀

    (一)FreeRTOS學習之FreeRTOS任務基礎知識

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

    FreeRTOS任務詳解

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

    圖解FreeRTOS 原理系列之任務管理器基本框架

    [導讀] 學習梳理一下FreeRTOS任務管理單元實現(xiàn)思路,代碼分析基于V10.4.3。從本文開始計劃寫個圖解freeRTOS內(nèi)核系列筆記分享給朋友們,...
    發(fā)表于 01-25 19:49 ?5次下載
    圖解<b class='flag-5'>FreeRTOS</b> 原理系列之<b class='flag-5'>任務</b><b class='flag-5'>管理</b>器基本框架

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

    FreeRTOS基礎系列《FreeRTOS系列第10篇---FreeRTOS任務創(chuàng)建和刪除》中介紹了任務創(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'>任務</b>創(chuàng)建分析

    FreeRTOS系列第11篇---FreeRTOS任務控制

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

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

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

    freeRTOS任務

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

    FreeRTOS的空閑任務是什么

    空閑任務FreeRTOS 必不可少的一個任務,其他 RTOS 類系統(tǒng)也有空閑任務,比如 uC/OS??疵志椭?,空閑任務是處理器空閑的
    的頭像 發(fā)表于 07-30 10:55 ?1486次閱讀

    FreeRTOS任務通知簡介

    任務通知簡介 任務通知在 FreeRTOS 是一個可選的功能,要使用任務通知的話就需要將宏configUSE_TASK_NOTIFICAT
    的頭像 發(fā)表于 07-30 11:34 ?907次閱讀

    FreeRTOS內(nèi)存管理實現(xiàn)

    FreeRTOS是一個為嵌入式系統(tǒng)設計的開源實時操作系統(tǒng)。它提供了一個多任務內(nèi)核和一系列功能,適合在資源受限的設備上管理實時任務和應用程序。Free
    的頭像 發(fā)表于 10-10 16:17 ?1048次閱讀
    <b class='flag-5'>FreeRTOS</b>內(nèi)存<b class='flag-5'>管理</b>實現(xiàn)

    freertos最多支持多少個任務

    FreeRTOS是一個輕量級的實時操作系統(tǒng)(RTOS),其設計初衷就是為了提供簡單、可靠且高效的實時任務管理。關(guān)于FreeRTOS最多支持多少個任務
    的頭像 發(fā)表于 09-02 14:21 ?1852次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品