FreeRTOS的任务创建和删除

1,任务创建和删除的API函数

        任务的创建和删除本质就是调用FreeRTOSAPI函数

 动态创建任务:

        任务的任务控制块以及任务的栈空间所需的内存,均由 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 	/* 任务句柄,就是任务的任务控制块 */
)

实现动态创建任务流程 

        用起来只需这三步:

1、将宏configSUPPORT_DYNAMIC_ALLOCATION 配置为 1

2、定义函数入口参数

3、编写任务函数

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

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

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

2TCB结构体成员赋值

3、添加新任务到就绪列表中

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

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, 		/* 任务堆栈大小注意字为单位 */
    	void * const			pvParameters, 		/* 传递的任务函数参数 */
    	UBaseType_t			    uxPriority, 		/* 任务优先级 */
    	StackType_t * const		puxStackBuffer, 	/* 任务堆栈,一般为数组,由用户分配 */
    	StaticTask_t * const	pxTaskBuffer	    /* 任务控制块指针,由用户分配 */
); 		

 静态创建任务使用流程

        用起来只需这五步:

1、需将宏configSUPPORT_STATIC_ALLOCATION 配置为 1

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

3、实现两个接口函数

vApplicationGetIdleTaskMemory( )            //空闲任务内存分配

vApplicationGetTimerTaskMemory ( )        //软件定时器内存分配(可选,FreeRTOSconfig.h里面没有使能软件定时器的话,就不需要)

4、定义函数入口参数

5、编写任务函数

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

        静态创建内部实现:

1TCB结构体成员赋值

2、添加新任务到就绪列表中

任务删除函数

void vTaskDelete(TaskHandle_t xTaskToDelete);

        用于删除已被创建的任务

        被删除的任务将从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除

注意:

1、当传入的参数为NULL,则代表删除任务自身(当前正在运行的任务)

2、当在当前任务时执行任务删除函数,需先添加到等待删除列表,内存释放将在空闲任务执行,空闲任务会负责释放被删除任务中由系统分配的内存,但是由用户在任务删除前申请的内存, 则需要由用户在任务被删除前提前释放,否则将导致内存泄露。

删除任务流程

        用起来只要这两步:

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

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

        内部实现过程:

1、获取所要删除任务的控制块

        通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身

2、将被删除任务,移除所在列表

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

3、判断所需要删除的任务

        删除任务自身,需先添加到等待删除列表,内存释放将在空闲任务执行

        删除其他任务,释放内存,任务数量--

4、更新下个任务的阻塞时间

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过Ngrok实现内网穿透助力远程开发

在现代软件开发和网络应用的环境下,开发人员常常需要在本地搭建服务器进行调试、测试或演示。然而,传统的端口映射(如使用 NAT 或 SSH 隧道)配置繁琐,且并非所有环境都允许直接暴露本地服务。ngrok 作为一款强大的隧道…

Elasticsearch的索引生命周期管理

目录 说明零、参考一、ILM的基本概念二、ILM的实践步骤Elasticsearch ILM策略中的“最小年龄”是如何计算的?如何监控和调整Elasticsearch ILM策略的性能? 1. **监控性能**使用/_cat/thread_pool API基本请求格式请求特定线程池的信息响应内容 2. **调整…

wx043基于springboot+vue+uniapp的智慧物流小程序

开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…

关于使用PHP时WordPress排错——“这意味着您在wp-config.php文件中指定的用户名和密码信息不正确”的解决办法

本来是看到一位好友的自己建站,所以突发奇想,在本地装个WordPress玩玩吧,就尝试着装了一下,因为之前电脑上就有MySQL,所以在自己使用PHP建立MySQL时报错了。 最开始是我的php启动mysql时有问题,也就是启动过…

批量卸载fnm中已经安装的所有版本

直接上代码 fnm list | awk -F NR>1 {print line} {line$2} | xargs -n 1 -I {} fnm uninstall {}原理 fnm list 列出 fnm 中所有已经安装的 node 版本 awk -F NR>1 {print line} {line$2} 以空格分隔-F {line$2},取从左到右第 2 段(v22.11…

gesp(C++六级)(7)洛谷:P10376:[GESP202403 六级] 游戏

gesp(C六级)(7)洛谷:P10376:[GESP202403 六级] 游戏 题目描述 你有四个正整数 n , a , b , c n,a,b,c n,a,b,c,并准备用它们玩一个简单的小游戏。 在一轮游戏操作中,你可以选择将 n n n 减去 a a a&am…

Microsoft Visual Studio 2022 主题修改(补充)

Microsoft Visual Studio 2022 透明背景修改这方面已经有很多佬介绍过了,今天闲来无事就补充几点细节。 具体的修改可以参考:Microsoft Visual Studio 2022 透明背景修改(快捷方法)_material studio怎么把背景弄成透明-CSDN博客文…

新时代架构SpringBoot+Vue的理解(含axios/ajax)

文章目录 引言SpringBootThymeleafVueSpringBootSpringBootVue(前端)axios/ajaxVue作用响应式动态绑定单页面应用SPA前端路由 前端路由URL和后端API URL的区别前端路由的数据从哪里来的 Vue和只用三件套axios区别 关于地址栏url和axios请求不一致VueJSPS…

【教学类-89-01】20250127新年篇01—— 蛇年红包(WORD模版)

祈愿在2025蛇年里, 伟大的祖国风调雨顺、国泰民安、每个人齐心协力,共同经历这百年未有之大变局时代(国际政治、AI技术……) 祝福亲友同事孩子们平安健康(安全、安全、安全)、巳巳如意! 背景需…

用XAMPP安装PHP环境(Window系统)

视频教程 BV1jA411v791 进入XAMPP官网 Download XAMPP 找到最新版本,64位的下载,一路安装,语言只有英语德语两个(不会德语) 安装好以后启动软件,点Apache,MySql,start 在C:\xampp\…

并发编程 - 线程同步(二)

经过前面对线程同步初步了解,相信大家对线程同步已经有了整体概念,今天我们就来一起看看线程同步的具体方案。 01、ThreadStatic 严格意义上来说这两个并不是实现线程同步方案,而是解决多线程资源安全问题,而我们研究线程同步最终…

回顾:Maven的环境搭建

1、下载apache-maven-3.6.0 **网址:**http://maven.apache.org 然后解压到指定的文件夹(记住文件路径) 2、配置Maven环境 复制bin文件夹 的路径D:\JavaTool\apache-maven-3.6.0\bin 环境配置成功 3、检查是否配置成功 winR 输入cmd 命令行输入mvn -v…

DRF开发避坑指南01

在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…

DeepSeek R1:中国AI黑马的崛起与挑战

文章目录 技术突破:从零开始的推理能力进化DeepSeek R1-Zero:纯RL训练的“自我觉醒”DeepSeek R1:冷启动与多阶段训练的平衡之道 实验验证:推理能力的全方位跃升基准测试:超越顶尖闭源模型蒸馏技术:小模型的…

电路研究9.2.4——合宙Air780EP中MQTT 相关命令使用方法研究

之前研究了FTP命令,这次研究一下MQTT命令了。 16.14 使用方法举例 9.5.3 MQTT 应用指南 4G 模块支持 MQTT 和 MQTT SSl 协议, MQTT 应用的基本流程如下: 1、如果要支持 SSL,配置 SSL 参数2、通过 TCP 连接到 MQTT 服务器 3、发送 …

寻找旋转数组中的最小元素:C语言实现与分析

在算法与编程的世界里,经常会遇到各种有趣的问题。今天我们来探讨一个经典的题目:寻找旋转数组中的最小元素。我们将通过C语言代码实现,并详细分析其原理和实现细节。 题目描述 给定一个可能旋转过的递增排序数组,找到数组中的最小…

Object类(3)

大家好,今天继续给大家介绍一下object类中的方法,那么话不多说,来看。 hashcode()这个方法,帮我们算了一个具体的对象位置,这里面涉及到数据结构,简单认为它是个内存地址,然后调用Integer.toHexString ()将这个地址以16进制输出。 该方法是一…

Kafka 日志存储 — 磁盘存储

Kafka 依赖与磁盘来存储和缓存消息,采用文件追加的方式来写入消息。顺序写盘的速度快于随机写内存。 1 磁盘存储 除顺序写入外,Kafka中大量使用了页缓存、零拷贝等技术来进一步提升吞吐性能。 1.1 页缓存 页缓存是操作系统实现的一种磁盘缓存&#x…

基于SpringBoot的阳光幼儿园管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

什么是长短期记忆网络?

一、概念 长短期记忆网络(Long Short-Term Memory, LSTM)是一种特殊的循环神经网络(RNN),旨在解决标准RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM通过引入三个门(输入门、遗忘门和输出门&#xff09…