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

    文章

    10443

    浏览量

    206565
  • API
    API
    +关注

    关注

    2

    文章

    1382

    浏览量

    60992
  • 函数
    +关注

    关注

    3

    文章

    3880

    浏览量

    61310
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66772
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61348
收藏 人收藏

    评论

    相关推荐

    FreeRTOS介绍与基础任务创建

    本篇介绍FreeRTOS与基础任务创建
    的头像 发表于 09-26 09:00 1871次阅读
    <b class='flag-5'>FreeRTOS</b>介绍与基础<b class='flag-5'>任务</b>创建

    转:第10章 FreeRTOS任务管理

    第10章FreeRTOS任务管理 对于初学者,特别是对于没有RTOS基础的同学来说,了解FreeRTOS任务
    发表于 08-23 09:54

    FreeRTOS任务堆栈溢出检测机制

    FreeRTOS,每个任务都拥有自己的堆栈,该堆栈的大小由创建任务时xTaskCreate函数的函数参数所决定。但当任务所使用的堆栈空间
    发表于 10-15 13:51

    梳理一下FreeRTOS任务管理单元实现思路

    关注、星标嵌入式客栈,精彩及时送达[导读] 学习梳理一下FreeRTOS任务管理单元实现思路,代码分析基于V10.4.3。从本文开始计划写个图解freeRTOS内核系列笔记分享给朋友们
    发表于 01-13 07:08

    什么是多任务系统?FreeRTOS任务与协程简析

    FreeRTOS学习之FreeRTOS任务基础知识转行小白一枚,通过博客记录自我学习,望更多博友多多指点,感激不尽!RTOS系统的核心就是任务管理
    发表于 02-18 06:38

    freertos怎么在任务修改任务的优先级?

    freertos怎么在任务修改任务的优先级
    发表于 10-11 07:56

    (一)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 11次下载
    <b class='flag-5'>FreeRTOS</b>系列第11篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>控制

    FreeRTOS系列第8篇---FreeRTOS内存管理

    本文介绍内存管理的基础知识,详细源码分析见《 FreeRTOS高级篇7---FreeRTOS内存管理分析》
    发表于 01-26 17:56 17次下载
    <b class='flag-5'>FreeRTOS</b>系列第8篇---<b class='flag-5'>FreeRTOS</b>内存<b class='flag-5'>管理</b>

    freeRTOS任务

    freeRTOS系统的任务切换的具体过程最终都是在pendSV中断服务函数里面完成的。
    的头像 发表于 02-10 11:02 1060次阅读
    <b class='flag-5'>freeRTOS</b>的<b class='flag-5'>任务</b>

    FreeRTOS任务通知简介

    任务通知简介 任务通知在 FreeRTOS 中是一个可选的功能,要使用任务通知的话就需要将宏configUSE_TASK_NOTIFICATIONS 定义为 1。
    的头像 发表于 07-30 11:34 488次阅读

    FreeRTOS内存管理实现

    FreeRTOS是一个为嵌入式系统设计的开源实时操作系统。它提供了一个多任务内核和一系列功能,适合在资源受限的设备上管理实时任务和应用程序。Free
    的头像 发表于 10-10 16:17 502次阅读
    <b class='flag-5'>FreeRTOS</b>内存<b class='flag-5'>管理</b>实现