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.rhkb.cn/news/892.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结,具体如下: 一、按芯片类型 CCD相机:采用电荷耦合器件(CC…

数字证书管理服务

阿里云数字证书管理服务(Aliyun Certificate Management Service, ACM)是一种云端服务,专门用于帮助企业管理和颁发数字证书。数字证书是网络安全中的重要组成部分,它可以确保通信的安全性、身份认证以及数据的完整性。通过阿里云…

《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)

章节文章名备注第1节Spring Boot(1)基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot(2)解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot(3)教你手工搭建Spring Boot项目纯手工玩法…

Zookeeper概览

个人博客地址:Zookeeper概览 | 一张假钞的真实世界 设计目标 简单的:方便使用以实现复杂的业务应用。复制式的:跟Zookeeper协调的分布式进程一样,它也是在一组服务器上复制的。集群的每个节点间互相知道。它们维护一个状态数据在…

播放音频文件同步音频文本

播放音频同步音频文本 对应单个文本高亮显示 使用audio音频文件对应音频文本资源 音频文本内容(Json) [{"end": 4875,"index": 0,"speaker": 0,"start": 30,"text": "70号二啊,","tex…

React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解

基础概念 Element对象与Fiber对象 Element对象与Fiber对象 Element 对象 定义 React 的 Element 对象是一个描述用户界面(UI)的普通 JavaScript 对象,通常由 React.createElement 或 JSX 语法生成。 作用 它是 React 应用中的一种描述 …

【airtest】自动化入门教程Poco元素定位

1. 前言 本文将详细讲解Poco控件定位的各种方式,利用这些方法可以帮助我们编写出目标控件的定位脚本。我们在IDE录制的poco脚本,常见的都是类似 poco(“star_single”).click()这样的脚本,其中 poco(“star_single”) 这块就属于Poco控件定位…

2025年01月13日Github流行趋势

1. 项目名称:Jobs_Applier_AI_Agent 项目地址url:https://github.com/feder-cr/Jobs_Applier_AI_Agent项目语言:Python历史star数:25929今日star数:401项目维护者:surapuramakhil, feder-cr, cjbbb, sarob…

[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue新能源汽车充电桩管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来&#xff0…

【C++】字符串中的 insert 方法深层分析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯一、基础知识:insert 方法概述功能描述函数原原型基本规则 💯二、例子解析例子 1:插入一个 std::string分析 例子 2:插入一个…

G-Star Landscape 2.0 重磅发布,助力开源生态再升级

近日,备受行业瞩目的 G-Star Landscape 迎来了其 2.0 版本的发布,这一成果标志着 GitCode 在开源生态建设方面又取得了重要进展。 G-Star Landscape仓库链接: https://gitcode.com/GitCode-official-team/G-Star-landscape 2024 GitCode 开…

Sui Move:基本概览一

Module (模块) Move 代码被组织成模块, 可以把一个模块看成是区块链上的一个智能合约 可以通过调用这些模块中的函数来与模块进行交互,可以通过事务或其他 Move 代码来实现, 事务将被发送到并由Sui区块链进行处理,一旦执行完成,结果的更改将…

不同方式获取音频时长 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

25年无人机行业资讯 | 1.1 - 1.5

25年无人机行业资讯 | 1.1 - 1.5 中央党报《经济日报》刊文:低空经济蓄势待发,高质量发展需的平衡三大关系 据新华网消息,2025年1月3日,中央党报《经济日报》发表文章指出,随着国家发展改革委低空经济发展司的成立&a…

frp内网穿透

frp CS搭建socks隧道 kali当作客户端,vps当作服务端,webshell机器上传后门,CS上线,使用CS自带socks搭建隧道 选择socks代理 服务端启动:frps -c frpssocks.toml serverAddr "47.104.216.23" serverPort…

【JVM-2.2】使用JConsole监控和管理Java应用程序:从入门到精通

在Java应用程序的开发和运维过程中,监控和管理应用程序的性能和资源使用情况是非常重要的。JConsole是Java Development Kit(JDK)自带的一款图形化监控工具,它可以帮助开发者实时监控Java应用程序的内存、线程、类加载以及垃圾回收…

Linux之读者写者模型与特殊锁的学习

目录 读者写者模型 特殊锁 悲观锁 自旋锁 在前几期,我们学习了多线程的生产者和消费者模型,生产者和消费者模型中,有三种关系,两个角色,一个场所,那么读者写者模型和生产者消费者模型有什么关联吗&…

MACPA:fMRI连接性分析的新工具

摘要 不同脑区的共同激活为它们之间的功能交互或连接提供了一个有价值的衡量指标。元分析连接模型(MACM)是一种经过充分验证的研究某一特定区域共激活模式的方法,该方法对基于任务的功能磁共振成像(task-fMRI)数据进行种子点(seed-based)元分析。虽然MACM是一种强大…

计算机组成原理(1)

系统概述 计算机硬件基本组成早期冯诺依曼机现代计算机 计算机各部分工作原理主存储器运算器控制器计算机工作过程 此文章的图片资源获取来自于王道考研 计算机硬件基本组成 早期冯诺依曼机 存储程序是指将指令以二进制的形式事先输入到计算机的主存储器,然后按照…

Ubuntu如何安装ESP32-idf

参考文章: Ubuntu配置ESP-IDF: Linux 和 macOS 平台工具链的标准设置 - ESP32 - — ESP-IDF 编程指南 v5.4 文档 知乎 https://zhuanlan.zhihu.com/p/963186891 通过WSL2连接USB串口调试ESP32 通过WSL2连接USB串口调试ESP32_windows wsl连接串口-CSDN博客…