当前位置: 首页 > article >正文

STM32 FreeRTOS的任务创建和删除

目录

任务创建和删除的API函数

动态创建任务函数

函数说明

动态创建任务步骤

动态创建任务函数内部实现

静态创建任务函数

函数说明

静态创建任务步骤

静态创建内部实现

任务删除函数 

函数说明

删除任务流程

内部实现过程


任务创建和删除的API函数

任务的创建和删除本质就是调用FreeRTOS的API函数,主要如下:

API函数

描述

xTaskCreate()

动态方式创建任务

xTaskCreateStatic()

静态方式创建任务

vTaskDelete()

删除任务

动态创建任务:任务的任务控制块以及任务的栈空间所需的内存,均由 FreeRTOS 从 FreeRTOS 管理的堆中分配。

静态创建任务:任务的任务控制块以及任务的栈空间所需的内存,需用户分配提供。

动态创建任务函数

函数说明
BaseType_t xTaskCreate
(
    TaskFunction_t pxTaskCode,                  /* 指向任务函数的指针 */
    const char * const pcName,                  /* 任务名字,最大长度configMAX_TASK_NAME_LEN */
    const configSTACK_DEPTH_TYPE usStackDepth,  /* 任务堆栈大小,默认单位4字节 */
    void * const pvParameters,                  /* 传递给任务函数的参数 */
    UBaseType_t uxPriority,                     /* 任务优先级,范围:0 ~ configMAX_PRIORITIES - 1 */
    TaskHandle_t * const pxCreatedTask          /* 任务句柄,就是任务的任务控制块 */
)   

返回值说明如下:

  • pdPASS:任务创建成功。
  • errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:任务创建失败。
动态创建任务步骤

将宏configSUPPORT_DYNAMIC_ALLOCATION 配置为 1。

定义函数入口参数。

编写任务函数。

此函数创建的任务会立刻进入就绪态,由任务调度器调度运行。

动态创建任务函数内部实现

申请堆栈内存&任务控制块内存。

TCB结构体成员赋值。

添加新任务到就绪列表中。

任务控制块结构体成员介绍。

typedef struct tskTaskControlBlock       
{
    volatile StackType_t * pxTopOfStack; /* 任务栈栈顶,必须为TCB的第一个成员 */
    ListItem_t xStateListItem;                  /* 任务状态列表项 */
    ListItem_t xEventListItem;                  /* 任务事件列表项 */
    UBaseType_t uxPriority;                     /* 任务优先级,数值越大,优先级越大 */
    StackType_t * pxStack;                      /* 任务栈起始地址 */
    char pcTaskName[ configMAX_TASK_NAME_LEN ]; /* 任务名字 */  
    …
    省略很多条件编译的成员
} tskTCB;

任务栈栈顶,在任务切换时的任务上下文保存、任务恢复息息相关。每个任务都有属于自己的任务控制块,类似身份证。

静态创建任务函数

函数说明
TaskHandle_t xTaskCreateStatic
( 
    TaskFunction_t pxTaskCode,          /* 指向任务函数的指针 */
    const char * const pcName,          /* 任务函数名 */
    const uint32_t ulStackDepth,        /* 任务堆栈大小,单位是4字节 */
    void * const pvParameters,          /* 传递的任务函数参数 */
    UBaseType_t uxPriority,             /* 任务优先级 */
    StackType_t * const puxStackBuffer, /* 任务堆栈,一般为数组,由用户分配 */
    StaticTask_t * const pxTaskBuffer   /* 任务控制块指针,由用户分配 */
)

返回值如下:

  • NULL:用户没有提供相应的内存,任务创建失败。
  • 其他值:任务句柄,任务创建成功。
静态创建任务步骤

将宏configSUPPORT_STATIC_ALLOCATION 配置为

定义空闲任务&定时器任务的任务堆栈及TCB。

实现接口函数:

  • vApplicationGetIdleTaskMemory()
  • vApplicationGetTimerTaskMemory()(如果开启软件定时器)

定义函数入口参数。

编写任务函数

此函数创建的任务会立刻进入就绪态,由任务调度器调度运行。

静态创建内部实现

TCB结构体成员赋值

添加新任务到就绪列表中

任务删除函数 

函数说明
void vTaskDelete( TaskHandle_t xTaskToDelete )

参数说明:xTaskToDelete待删除任务的任务句柄。当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)。

该函数用于删除已被创建的任务,被删除的任务将从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除。

需要注意的是,空闲任务会负责释放被删除任务中由系统分配的内存,但是由用户在任务删除前申请的内存,则需要由用户在任务被删除前提前释放,否则将导致内存泄露。

删除任务流程

使用删除任务函数,需将宏INCLUDE_vTaskDelete 配置为

入口参数输入需要删除的任务句柄(NULL代表删除本身)

内部实现过程

1、获取所要删除任务的控制块---通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身。

2、将被删除任务,移除所在列表---将该任务在所在列表中移除,包括:就绪、阻塞、挂起、事件等列表。

3、判断所需要删除的任务---如果删除任务自身,需先添加到等待删除列表,内存释放将在空闲任务执行;如果删除其他任务,释放内存,任务数量--。

4、更新下个任务的阻塞时间---更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务。


http://www.kler.cn/a/502205.html

相关文章:

  • RK3568-rk809rtc休眠唤醒
  • 自动连接校园网wifi脚本实践(自动网页认证)
  • Colossal-AI:深度学习大规模分布式训练框架
  • 欧拉公式和傅里叶变换
  • 【华为OD-E卷 - IPv4地址转换成整数 100分(python、java、c++、js、c)】
  • vscode vue 自动格式化
  • 2_CSS3 背景 --[CSS3 进阶之路]
  • vue集成导出 txt文本文档 和 excel文档 的方法
  • jsdom爬虫程序中eBay主页内容爬取的异步处理
  • 从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系
  • 【论文笔记】Sign Language Video Retrieval with Free-Form Textual Queries
  • IDEA的Git界面(ALT+9)log选项不显示问题小记
  • 基于Java的推箱子游戏设计与实现
  • 31_搭建Redis分片集群
  • React中Fiber树构建过程详解——react中render一个App组件(包含子组件)的流程详解
  • 深度学习中的常见初始化方法:原理、应用与比较
  • C语言结构体如何实现位段
  • async++源码阅读——task模块
  • 【HM-React】08. Layout模块
  • 树状数组与线段树简单讲解与习题
  • SQLite 语法快速入门
  • 为AI聊天工具添加一个知识系统 之32 三“中”全“会”:推理式的ISA(父类)和IOS(母本)以及生成式CMN (双亲委派)之1
  • 数据预测2025年AI面试市场增幅超500%!
  • 机器学习 - 常用的损失函数(0-1、平方)
  • AIDD-人工智能药物设计-3DSMILES-GPT:基于词元化语言模型的3D分子生成
  • pytorch小记(二):pytorch中的连接操作:torch.cat(tensors, dim=0)