那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

FreeRTOS中的任務管理

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

任務概述

任務是 FreeRTOS 中最基本的調度單元,它是一段可執行的代碼,可以獨立運行。FreeRTOS 中的任務是基于優先級的搶占式調度,優先級高的任務可以搶占優先級低的任務的 CPU 資源。任務的創建、刪除、掛起、恢復、設置優先級等操作都是通過調用 API 函數來實現的。

任務的創建

任務的創建是通過調用 xTaskCreate 函數來實現的,函數原型如下:

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 );

參數說明:

  • pxTaskCode:任務函數的入口地址。
  • pcName:任務的名字,用于調試。
  • usStackDepth:任務棧的大小,單位為字。
  • pvParameters:傳遞給任務函數的參數。
  • uxPriority:任務的優先級。
  • pxCreatedTask:任務創建成功后,返回任務句柄。

任務的刪除

任務的刪除是通過調用 vTaskDelete 函數來實現的,函數原型如下:

void vTaskDelete( TaskHandle_t xTask );

參數說明:

  • xTask:任務句柄。

任務的掛起和恢復

任務的掛起和恢復是通過調用 vTaskSuspendxTaskResume 函數來實現的,函數原型如下:

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

參數說明:

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

任務的優先級

任務的優先級是通過調用 vTaskPrioritySetxTaskPriorityGet 函數來實現的,函數原型如下:

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

參數說明:

  • xTask:任務句柄。
  • uxNewPriority:新的優先級。
  • pxPreviousPriority:保存原來的優先級。

注意: 在 FreeRTOS 中,優先級數值越大,優先級越高,任務的優先級不能超過 configMAX_PRIORITIES 宏定義的值。

任務的延時

任務的延時是通過調用 vTaskDelay 函數來實現的,函數原型如下:

void vTaskDelay( const TickType_t xTicksToDelay );

參數說明:

  • xTicksToDelay:延時時間,單位為時鐘節拍。

任務的阻塞

任務的阻塞是通過調用 vTaskDelayUntil 函數來實現的,函數原型如下:

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

參數說明:

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

任務的阻塞和喚醒

任務的阻塞和喚醒是通過調用 xTaskNotifyWaitxTaskNotify 函數來實現的,函數原型如下:

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 );

參數說明:

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

Playground

創建任務

創建 2 個優先級都是1的任務.

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

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

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

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

    // 創建任務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的函數
void task1(void *pvParameter) {
    while (1) {
    }
}

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

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

    // 創建任務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
...

可以看到,相同優先級的任務 2 依然可以正常運行,而任務 1 則觸發了看門狗。兩個任務按照時間片輪轉的方式共享 CPU 資源。可以想見,如果任務 1 的優先級比任務 2 高,那么任務 1 就會獨占 CPU 資源,任務 2 就無法運行了。

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

    關注

    68

    文章

    10902

    瀏覽量

    212997
  • API
    API
    +關注

    關注

    2

    文章

    1510

    瀏覽量

    62393
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62968
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69039
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62394
收藏 人收藏

    評論

    相關推薦

    FreeRTOS介紹與基礎任務創建

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

    轉:第10章 FreeRTOS任務管理

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

    梳理一下FreeRTOS任務管理單元實現思路

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

    FreeRTOS任務如何創建和刪除?

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

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

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

    FreeRTOS任務詳解

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

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

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

    FreeRTOS高級篇2---FreeRTOS任務創建分析

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

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

    FreeRTOS任務控制API函數主要實現任務延時、任務掛起、解除任務掛起、任務優先級獲取和設置
    發表于 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任務創建和刪除

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

    freeRTOS任務

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

    FreeRTOS的空閑任務是什么

    空閑任務FreeRTOS 必不可少的一個任務,其他 RTOS 類系統也有空閑任務,比如 uC/OS。看名字就知道,空閑任務是處理器空閑的
    的頭像 發表于 07-30 10:55 ?1324次閱讀

    FreeRTOS任務通知簡介

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

    FreeRTOS內存管理實現

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

    freertos最多支持多少個任務

    FreeRTOS是一個輕量級的實時操作系統(RTOS),其設計初衷就是為了提供簡單、可靠且高效的實時任務管理。關于FreeRTOS最多支持多少個任務
    的頭像 發表于 09-02 14:21 ?1182次閱讀
    百家乐群lookcc| 百家乐官网真人游戏网上投注 | 百家乐官网龙虎扑克| 百家乐官网与龙虎斗怎么玩| 百家乐官网投注庄闲法| 百家乐官网庄闲桌子| 澳门百家乐官网赌| 百家乐官网是否能赢| 曲周县| 百家乐官网玩法百科| 百家乐官网赌场优势| 百家乐官网庄闲赢负表| 百家乐官网扎金花现金| 百家乐官网网哪一家做的最好呀| 百家乐洗码方法| 网上百家乐假| 真人游戏网站| 网上博彩网址| 屏南县| 百家乐官网网络赌博真假| 百家乐官网的巧门| 百家乐硬币打法| 游戏百家乐押金| 大发888客服| 明珠国际娱乐| 百家乐官网玩法注意事项| 百家乐官网赌场代理| 做生意什么花风水好| 百家乐马渚| 肯博百家乐的玩法技巧和规则| 全讯网carrui| 夹江县| 百家乐官网庄6点| 顶尖百家乐对单| 威尼斯人娱乐城备用地址| 大发888下载 34| 钱大发888扑克| 百家乐官网是骗人吗| 传奇百家乐官网的玩法技巧和规则| 百家乐跟路技巧| 百家乐龙虎规则|