STM32 FreeRTOS的任务创建和删除

server/2025/1/15 15:26:16/

目录

任务创建和删除的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.ppmy.cn/server/158205.html

相关文章

搭建docker私有化仓库Harbor

Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…

【ASP.NET学习】Web Forms创建Web应用

文章目录 什么是 Web Forms?ASP.NET Web Forms - HTML 页面用 ASP.NET 编写的 Hello RUNOOB.COM它是如何工作的?经典 ASP ASP.NET Web Forms - 服务器控件经典 ASP 的局限性ASP.NET - 服务器控件ASP.NET - HTML 服务器控件ASP.NET - Web 服务器控件ASP.N…

【Redis学习 | 第5篇】Redis缓存 —— 缓存的概念 + 缓存穿透 + 缓存雪崩 + 缓存击穿

文章目录 完成任务1. 什么是缓存2. 添加商户缓存3. 缓存更新策略3.1 主动更新 4. 缓存穿透5. 缓存雪崩6. 缓存击穿6.1 使用互斥锁查询商铺信息6.2 使用逻辑过期查询商铺信息 7. 封装 Redis 工具类 完成任务 1. 什么是缓存 缓存:数据交换的缓冲区(Cache…

计算机视觉算法实战——头盔检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​​​​​​​​​​​ ​​​​​​ 1. 领域简介✨✨ 计算机视觉是人工智能的一个重要分支,旨在通过算法让计算机“看懂…

什么是TCP重传率,有什么用?如何查看?

TCP重传率是一个衡量TCP网络性能的重要指标,它指的是在TCP通信过程中,由于数据包丢失、损坏或确认(ACK)未按预期到达而导致的数据包重传的比例或率。 TCP协议通过重传机制来保证数据传输的可靠性,但过高的重传率通常意味着网络质量问题&…

Django创建数据表、模型、ORM操作

1、创建项目 django-admin startproject PersonInfosProject 2、创建项目应用,进入PersonInfosProject文件夹,新建index应用,使用命令 cd PersonInfosProject python manage.py startapp 新建完成之后的目录结构 3、新建数据模型&#xf…

“天上北斗+地上5G”,遨游北斗终端绘危急特场景通信新蓝图

天上的北斗地上的5G,可以擦出怎样的火花?在众多卫星系统中,北斗系统以其独特的RNSS和RDSS双模结构体制,不仅具备导航、定位和授时功能,更在RDSS双向短报文信息服务上实现了突破,成为全球首个集定位、授时与…

Linux系统编程之线程优先级

概述 在Linux系统中,线程优先级是影响多线程应用程序性能和响应速度的关键因素之一。通过合理设置线程优先级,可以确保关键任务得到及时处理,同时避免低优先级任务过度占用系统资源。 线程优先级是指操作系统根据一定的规则分配给每个线程的一…