【FreeRTOS】——API函数任务创建与删除挂起与恢复

news2025/2/28 18:49:53

目录

前言:

一、任务创建与删除的API函数

二、任务挂起与恢复的API函数

总结:


前言:

博客笔记根据正点原子视频教程编辑,仅供学习交流使用!

一、任务创建与删除的API函数

任务的创建和删除的本质就是调用FreeRTOS的API函数,任务创建创建分动态创建和静态创建:

动态创建任务:任务的任务控制块以及任务的栈空间所需的内存,均由 FreeRTOS 从 FreeRTOS 管理的自动分配,不需要人为操作。

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

          

①动态创建任务函数

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

注意:任务堆栈大小以字为单位;传递给任务函数的参数通常是空NULL。

 动态创建任务实际使用时只有三步:①将宏configSUPPORT_DYNAMIC_ALLOCATION配置为1。②定义函数入口参数。③编写任务函数。

创建之后,任务会立刻进入就绪态,由任务调度器调度运行!

动态创建任务函数内部机理:①申请堆栈内存&任务控制块内存。②TCB结构体成员赋值(TCB就是任务控制块,存储了任务的名字、优先级、状态等信息)。③添加新任务到就序列表。

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;

任务栈栈顶,在任务切换时的任务上下文保存、任务恢复紧密相关,必须放在TCB第一个;每个任务都有自己的任务控制块(TCB),类似于身份证。

②静态创建任务函数

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

注意:前五项与动态创建任务函数几乎一样,后两个参数与用户分配有关。

 静态创建任务实际使用时只有五步:将宏configSUPPORT_STATIC_ALLOCATION配置为1。②定义空闲任务&定时器任务的任务堆栈及TCB。③定义两个接口函数:空闲任务内存赋值vApplicationGetIdleTaskMemory( ) 和软件定时器内存赋值vApplicationGetTimerTaskMemory ()。④定义函数入口参数。⑤编写任务函数。

创建之后,任务会立刻进入就绪态,由任务调度器调度运行!

静态创建任务函数内部机理:①TCB结构体成员赋值。②添加新任务到就绪列表。

③删除任务函数

void vTaskDelete(TaskHandle_t xTaskToDelete); /*只有一个入口参数,待删除任务的任务句柄*/

只有创建成功的任务才可被删除,被删除的任务将从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除。

注意:当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务);空闲任务会负责释放被删除任务中由系统分配的内存(动态创建的),但是由用户在任务删除前申请的内存, 则需要由用户在任务被删除前提前释放,否则将导致内存泄露(静态创建的) 。

实际使用只有两步:①使用删除任务函数,需要将宏INCLUDE_vTaskDelete 配置为 1 。②入口参数输入需要删除的任务句柄(NULL代表删除本身)

内部机理:

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

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

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

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

二、任务挂起与恢复的API函数

挂起类似于暂停,可恢复;而删除任务,无法恢复。恢复就是恢复挂起的任务。带有“FromISR”后缀的是在中断函数中专用的API函数:

          

 ①任务挂起函数

void vTaskSuspend(TaskHandle_t xTaskToSuspend) /*也是一个参数,待挂起任务的任务句柄*/

注意:使用时需将宏 INCLUDE_vTaskSuspend  配置为 1;无论优先级如何,被挂起的任务都将不再被执行,直到任务被恢复;当传入的参数为NULL,则代表挂起任务自身(当前正在运行的任务)。

②任务恢复函数

void vTaskResume(TaskHandle_t xTaskToResume) /*也是只有一个参数,待恢复任务的任务句柄*/

注意:使用该函数注意宏INCLUDE_vTaskSuspend定义为 1;任务无论被 vTaskSuspend() 挂起多少次,只需在任务中调用  vTakResume() 恢复一次,就可以继续运行。且被恢复的任务会进入就绪态!

③中断中的任务恢复函数

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume) /*也是一个参数,待恢复任务的任务句柄*/

返回值:(被恢复的任务优先级高于正在执行任务时返回pdTRUE)

 注意:使用该函数注意宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须定义为 1,专用于中断服务函数中的恢复;中断服务程序中要想调用freeRTOS的API函数,则中断优先级不能高于FreeRTOS所管理(5-15)的最高优先级。

总结:

本段时间学习的实时操作系统都是基础知识,目的在于对于FreeRTOS有个整体的理论构架,暂且不涉及实操,后续实操会专门撰写记录笔记!

往期精彩:

电机应用控制——直流无刷电机

OpenCV机器视觉系列专栏

C语言进阶

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小宁ChatGPT智能机器人上线,无需魔法注册即可使用!

​大家好,今天我要向大家介绍一款基于人工智能技术的聊天机器人——ChatGPT。ChatGPT可以与用户进行自然语言交互,回答用户的问题、提供服务、进行闲聊等,让聊天变得更有趣。 小宁ChatGPT是对接ChatGPT官方api,实现无需魔法无误差…

使用Visual Studio 2019 创建JNI式的动态库及在Java代码中的使用

文章目录 JNI简介JNI 数据类型与 Java 、C 类型对比JNI式动态库函数编码规则Visual Studio下的编码JNI式动态库在Java代码中的使用改进版通过javah命令自动生成.h文件 JNI简介 JNI (Java Native Interface) 是 Java 沟通 Native 语言(主要是C、C)的桥梁…

《花雕学AI》34:用13种Prompt玩转AI聊天机器人—揭秘ChatGPT模型

引言: 聊天机器人是一种能够通过自然语言进行交流的智能系统,它可以模仿人类的对话方式,提供各种信息、服务或娱乐。随着人工智能技术的发展,聊天机器人的应用越来越广泛,从电商、教育、医疗、旅游等领域,到…

Spring ( 四 ) 注解注入

3.2.注解方式 目前 主流的方式 是使用注解方式来实现IoC效果. 3.2.1.配置类 在 config包下增加 SpringConfig 配置类 Configuration 声明当前类为配置类, SpringIoC容器会根据配置类信息进行配置 ComponentScan() bean扫描路径 , SpringIoC容器只维护 声明的路径下的增加&q…

华为OD机试真题 Java 实现【最多提取子串数目】【2023Q1 100分】

一、题目描述 给定由[a-z] 26 个英文小写字母组成的字符串 A和 B,其中A中可能存在重复字母,B 中不会存在重复字母,现从字符串 A 中按规则挑选一些字母,可以组成字符串 B。 挑选规则如下: 同一个位置的字母只能被挑选一次&#…

Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中

文章目录 前言一、引入SQL模块二、数据库的基本操作三、示例完整代码四、下载链接总结 前言 什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其…

软件 工程

目录 第十章、软件工程1、瀑布模型(SDLC)2、快速原型模型3、增量模型4、螺旋模型5、Ⅴ模型6、喷泉模型7、构建组装模型(CBSD)8、统一过程(RUP)9、敏捷开发方法10、信息系统开发方法11、需求开发12、结构化设…

Codeforces Round 872 (Div. 2) 题解

总结:5.9有同学问B题,所以就连同ABC题一起做了,都算是思维题吧,难度不算高 A. LuoTianyi and the Palindrome String 思路:输入的都为回文字符串,如果输入的回文字符串每个字符都相同,如"…

QT+VS推箱子小游戏

1、创建一个GUI程序,将界面设计成如下样式: 创建一个已QDialog为基类的子类,在窗体里添加一个pushbutton的按钮,一个QLabel用来显示文字。窗体的背景图片和按钮的背景颜色,都可以在样式中进行设计。 2、右键项目名称&…

ChatGPT 实现云原生转型

云原生转型 在相对专业的细分领域,chatGPT 能起到什么作用呢?能给出什么回答,怎么问才能得到好的回答呢?本节内容,将尝试从一个业界其实也还没有定论的话题,开始问答。这就是:云原生转型。 &q…

OpenCV教程——图像模糊。均值模糊,高斯模糊,中值模糊,双边模糊,高斯分布

1.图像模糊 图像模糊是图像处理中最简单和常用的操作之一。 ⚠️使用该操作的原因之一是为了给图像预处理时降低噪声。 图像模糊操作背后是数学的卷积计算。 卷积操作的原理: 常用的图像模糊的方法: 均值模糊高斯模糊中值模糊双边模糊 这四种模糊方式…

商用密码应用安全性测评机构资质流程

商用密码应用安全性测评机构(简称密评机构)资质建设相关指导性材料包括: 1、《商用密码应用安全性测评机构能力要求》 2、《商用密码应用安全性测评机构能力评审实施细则(试行)》 3、《商用密码应用安全性测评机构管理…

【Rust】速度入门---打印个螃蟹先

参考: 菜鸟教程 1 输出到命令行 这不得打印个螃蟹 // 代码来自官方入门教程 // ferris_say需要另外安装 use ferris_says::say; use std::io::{stdout, BufWriter};fn main() {let stdout: std::io::Stdout stdout();let msg: String String::from("Hello fellow Rusta…

无线传感器网络的Z-SEP路由协议及对比(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 无线传感网络最早应用于军事领域,随着工业界和学术界的关注度提高和技术的成熟,现已广泛应用于军事侦查…

kubernetes❀集群环境搭建

kubernetes❀集群环境搭建 2. kubernetes集群环境搭建2.1 前置知识点2.2 kubeadm 部署方式介绍2.3 安装要求2.4 最终目标2.5 准备环境2.6 环境初始化2.6.1 检查操作系统的版本2.6.2 主机名解析2.6.3 时间同步2.6.4 禁用iptable和firewalld服务2.6.5 禁用selinux2.6.6 禁用swap分…

Rust Wasm Linux开发环境搭建

一、Linux 镜像版本 CentOS-7-x86_64-DVD-2009.iso,Virtual Box 7.0 选择 GNOME Desktop 版本, 配置远程连接(可选), nmtui 激活连接 enp0s3 ,查看 ip 地址, 绑定端口转发, 通过…

gateway与zuul的区别与联系

前言 zuul1.0与spring-cloud-gateway的区别 Zuul: zuul是netflix公司的项目,本质上是web servlet,基于JavaEE Servlet技术栈,使用阻塞API,处理的是http请求,没有提供异步支持,不支持任何长连接&#xff0c…

Linux——进程信号3

内核如何实现信号的捕捉 信号捕捉的方法出了我们之前的signal之外,还有其它方法 sigaction sigaction:检查或更改一个信号的动作即捕捉信号 第一个参数,要捕捉的信号对应的编号,第二个参数:结构体(这个结构…

4种整流电路、5种滤波电路

目录 基本电路变压电路整流电路半波整流电路全波整流电路桥式整流电路倍压整流电路 滤波电路电容滤波电路电感滤波电路RC滤波电路LC滤波电路有源滤波电路 整流滤波电路总结常用整流电路性能对照常用无源滤波电路性能对照电容滤波电路输出电流大小与滤波电容量的关系常用整流滤波…

nodejs+vue大学招聘求职网站

该系统的基本功能包括学生注册登录,企业注册登录,发布个人简历,发布企业招聘信息,新闻资讯,招聘信息,企业管理,学生信息管理,招聘信息管理,修改密码等功能。 系统首页 后台界面 1.…