FreeRTOS:任务的创建和删除

news2024/11/24 6:41:51

目录

  • 一、函数xTaskCreate
  • 二、函数xTaskCreateStatic
  • 三、函数xTaskCreateRestricted
  • 四、函数vTaskDelete
  • 五、任务创建和删除(动态)代码
    • 5.1实验要求
    • 5.2程序代码

一、函数xTaskCreate

此函数用来创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM 来作为任务堆栈。
如果使用函数xTaskCreate()来创建任务的话那么这些所需的RAM就会自动的从FreeRTOS的堆中分配,因此必须提供内存管理文件,默认我们使用heap_4.c这个内存管理文件,而且宏configSUPPORT_DYNAMIC_ALLOCATION必须为1。
如果使用函数xTaskCreateStatic()创建的话这些RAM就需要用户来提供了。新创建的任务默认就是就绪态的,如果当前没有比它更高优先级的任务运行那么此任务就会立即进入运行态开始运行,不管在任务调度器启动前还是启动后,都可以创建任务。此函数也是我们以后经常用到的,函数原型如下:

 BaseType_t xTaskCreate( 
            TaskFunction_t pxTaskCode, 
            const char *const pcName, 
            const uint16_t usStackDepth, 
            void *const pvParameters, 
            UBaseType_t uxPriority, 
            TaskHandle_t *const pxCreatedTask)

参数:
pxTaskCode:任务函数。
pcName:任务名字,一般用于追踪和调试,任务名字长度不能超configMAX_TASK_NAME_LEN。
usStackDepth:任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍,例如数值128,即128字。其中空闲任务的任务堆栈大小为 configMINIMAL_STACK_SIZE。
pvParameters:传递给任务函数的参数。
uxPriotiry:任务优先级,范围0~configMAX_PRIORITIES-1。若填写的数值超过configMAX_PRIORITIES-1,则静默地配置为 configMAX_PRIORITIES-1。有些版本增加了configASSERT( uxPriority<configMAX_PRIORITIES )语句,且使能configASSERT_DEFINED,则停留在该处。
pxCreatedTask:任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任 务句柄。其他API函数可能会使用到这个句柄。

返回值:
pdPASS:任务创建成功。
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:任务创建失败,因为堆内存不足!

二、函数xTaskCreateStatic

此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的 RAM需要用用户来提供。如果要使用此函数的话需要将configSUPPORT_STATIC_ALLOCATION定义为1。函数原型如下:

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 );

参数:
pxTaskCode:任务函数。
pcName:任务名字,一般用于追踪和调试,任务名字长度不能超configMAX_TASK_NAME_LEN。
usStackDepth:任务堆栈大小,由于本函数是静态方法创建任务,所以任务堆栈由用户给出,一般是个数组,此参数就是这个数组的大小。
pvParameters:传递给任务函数的参数。
uxPriotiry:任务优先级,范围 0~configMAX_PRIORITIES-1,数值越大,优先级就越高,在FreeRTOSConfig.h可以配置configMAX_PRIORITIES.若填写的数值超过configMAX_PRIORITIES-1,则静默地配置为configMAX_PRIORITIES-1。有些版本增加了
configASSERT( uxPriority < configMAX_PRIORITIES )语句,且使能configASSERT_DEFINED,则停留在该处。
puxStackBuffer:任务堆栈,一般为数组,数组类型要为StackType_t类型。
pxTaskBuffer:任务控制块。

返回值:
NULL;任务创建失败,puxStackBuffer 或 pxTaskBuffer为 NULL的时候会导致这个错误的发生。
其他值:任务创建成功,返回任务的任务句柄

三、函数xTaskCreateRestricted

此函数也是用来创建任务的,只不过此函数要求所使用的MCU有MPU(内存保护单元),用此函数创建的任务会受到MPU的保护。其他的功能和函数xTaskCreate()一样。

BaseType_t xTaskCreateRestricted( 
        const TaskParameters_t * const pxTaskDefinition,
        TaskHandle_t *pxCreatedTask );

参数:
pxTaskDefinition:指向一个结构体TaskParameters_t,这个结构体描述了任务的任务函数、堆栈大小、优先级等。此结构体在文件 task.h中有定义。
pxCreatedTask:任务句柄。

返回值:
pdPASS:任务创建成功。
其他值:任务创建失败,因为堆栈内存不足!

四、函数vTaskDelete

删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务,被删除了的任务不再存在,也就是说再也不 会进入运行态。任务被删除以后就不能再使用此任务的句柄!如果此任务是使用动态方法创建的,也就是使用函数 xTaskCreate()创建的,那么在此任务被删除以后此任务之前申请的堆栈和控制块内存会在空闲任务中被释放掉,因此当 调用函数vTaskDelete()删除任务以后必须给空闲任务一定的运行时间。
只有那些由内核分配给任务的内存才会在任务被删除以后自动的释放掉,用户分配给任务的内存需要用户自行释放 掉,比如某个任务中用户调用函数 pvPortMalloc()分配了500字节的内存,那么在此任务被删除以后用户也必须调用函数
vPortFree()将这500字节的内存释放掉,否则会导致内存泄露。此函数原型如下:

 vTaskDelete( TaskHandle_t xTaskToDelete )

五、任务创建和删除(动态)代码

5.1实验要求

设计4个任务:start_task、task1、task2、task3

start_task任务:用来创建其他三个任务
task1任务:实现LED0每500ms翻转一次
task2任务:实现LED1亮800ms,暗200ms
task3任务:判断按键KEY0是否按下,按下KEY0删除task1

5.2程序代码

#include "led.h"
#include "key.h"
#include "delay.h"
#include "sys.h"
#include "FreeRTOS.h"
#include "task.h"
 
/*START_TASK 任务配置
 *包括:任务句柄,任务优先级,堆栈大小,创建任务
 */
//任务优先级
#define START_TASK_PRIO		1
//任务堆栈大小	
#define START_TASK_STACK_SIZE   128  //单位是字,128x4才是字节
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
 
/*TASK1 任务配置
 *包括:任务句柄,任务优先级,堆栈大小,创建任务
 */
//任务优先级
#define TASK1_PRIO		2
//任务堆栈大小	
#define TASK1_SIZE 		50  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);
 
/*TASK2 任务配置
 *包括:任务句柄,任务优先级,堆栈大小,创建任务
 */
//任务优先级
#define TASK2_PRIO		3
//任务堆栈大小	
#define TASK2_SIZE 		50  
//任务句柄
TaskHandle_t Task2_Handler;
//任务函数
void task2(void *pvParameters);
 
/*TASK3 任务配置
 *包括:任务句柄,任务优先级,堆栈大小,创建任务
 */
 //任务优先级
#define TASK3_PRIO		4
//任务堆栈大小	
#define TASK3_SIZE 		50  
//任务句柄
TaskHandle_t Task3_Handler;
//任务函数
void task3(void *pvParameters);
 
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4	 	 
	delay_init();	    				//延时函数初始化	  
	uart_init(115200);					//初始化串口
	LED_Init();		  					//初始化LED
	KEY_Init();               //按键初始化
	//创建开始任务
	  xTaskCreate(	(TaskFunction_t ) ,
									(const char *  	) "start_task",
									(uint16_t				) START_TASK_STACK_SIZE,
									(void *        	) NULL,
									(UBaseType_t   	) START_TASK_PRIO,
									(TaskHandle_t *	) &StartTask_Handler );							
    vTaskStartScheduler();          //开启任务调度
}
 
//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建taask1任务
    xTaskCreate((TaskFunction_t )task1,     	
                (const char*    )"task1",   	
                (uint16_t       )TASK1_SIZE, 
                (void*          )NULL,				
                (UBaseType_t    )TASK1_PRIO,	
                (TaskHandle_t*  )&Task1_Handler);   
    //创建task2任务
    xTaskCreate((TaskFunction_t )task2,     
                (const char*    )"task2",   
                (uint16_t       )TASK2_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )TASK2_PRIO,
                (TaskHandle_t*  )&Task2_Handler);        
			//创建task3任务
    xTaskCreate((TaskFunction_t )task3,     
                (const char*    )"task3",   
                (uint16_t       )TASK3_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )TASK3_PRIO,
                (TaskHandle_t*  )&Task3_Handler);
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}
 
//task1任务函数:实现LED0每500ms翻转一次
void task1(void *pvParameters)
{
    while(1)
    {
			  printf("Task1\r\n");
        LED0=~LED0;
        vTaskDelay(500);
    }
}   
 
//task2任务函数:实现LED1每800ms翻转一次
void task2(void *pvParameters)
{
    while(1)
    {
			  printf("Task2\r\n");
				LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);		
    }
}
 
//task3任务函数:判断按键KEY0,按下KEY0删除task1
void task3(void *pvParameters)
{
	uint8_t key = 0;
	while(1)
	{
		printf("Task3\r\n");
		key = KEY_Scan(0);
		if(key == KEY0_PRES)
		{
			printf("删除Task1\r\n");
			vTaskDelete(Task1_Handler);
		}
		 vTaskDelay(10);
	}
}

在这里插入图片描述

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

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

相关文章

Mysql数据库基本操作(增删改查)

目录 一、数据库的基本操作1.1 登录数据库1.2 创建数据库并进入数据库 二、查看数据库结构2.1 查看数据库信息2.2 查看数据库中包含的表及表结构2.3、常用的数据库类型 三、Mysql数据文件3.1 MYD文件3.2 MYI文件3.3 MyISAM存储引擎 四、SQL 语句1、 DDL数据定义语言1.1 删除指定…

〖Python网络爬虫实战㉒〗- 数据存储之数据库详解

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

Eureka、Zookeeper、Consul服务注册与发现

一、Eureka服务注册与发现 1.1 概念 Eureka 是 Netflix 公司开源的一个服务注册与发现的组件 。 Eureka 和其他 Netflix 公司的服务组件&#xff08;例如负载均衡、熔断器、网关等&#xff09; 一起&#xff0c;被 Spring Cloud 社区整合为Spring-Cloud-Netflix 模块。 Eure…

校招失败后,在小公司熬了 2 年终于进了百度,竭尽全力....

其实两年前校招的时候就往百度投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

【JavaEE】TCP协议的十大原理保姆讲解(Transmission Control Protocol)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 上一篇文章讲了UDP协议&#xff0c;那么这篇文章我来讲讲TCP协议&#xff0c;TCP协议相对UDP协议难一些&#xff0c;内容相对更多。 TCP&#xff0c;即Transmission Control Protocol&…

AArch32 AArch64 Registers map详细解析与索引

1、AArch32 Registers AArch32 系统寄存器索引。 例如第一个寄存器ACTLR点击后解析如下&#xff1a; 2、AArch64 Registers AArch64 系统寄存器索引。 3、AArch32 Operations AArch32 系统指令索引。 例如第一个寄存器ACTLR_EL1点击后解析如下&#xff1a; 4、AArch…

springboot+vue考研资讯平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的考研资讯平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

干翻Mybatis源码系列之第六篇:Mybatis缓存内容概述

前言 一&#xff1a;后续Mybatis我们会研究那些内容&#xff1f; Mybatis核心运行源码分析&#xff08;前面系列文章已经探讨过&#xff09; Mybatis中缓存的使用 Mybatis与Spring集成 Mybatis 插件。 Mybatis的插件可以对Mybatis内核功能或者是业务功能进行拓展&#xff0c…

David Silver Lecture 3: planning by dynamic programming

1 Introduction 1.1 定义 定义&#xff1a; Dynamic: sequential or temporal component to the problem Programming: optimising a program: a policy 核心思想&#xff1a; 将复杂问题拆解成简单子问题 1.2 Requirements for dynamic programming Optimal substructure …

【SWAT水文模型】SWAT水文模型建立及应用第三期:基于世界土壤数据库HWSD建立土壤库(待更新)

SWAT水文模型建立及应用&#xff1a;土壤库建立 1 简介2 土壤数据下载2.1 数据下载方式2.1.1 世界土壤数据库HWSD数据2.1.2 中国土壤数据库 2.2 数据下载 3 土壤数据的准备3.1 SWAT土壤数据库参数3.2 土壤质地转化3.3 土壤参数的提取3.4 其他变量的提取3.5 土壤类型分布图的处理…

高级IO涉及的编程模型

目录 五种IO模型引入IO模型阻塞IO非阻塞IO信号驱动IOO多路转接异步IO IO重要概念同步通信 vs 异步通信阻塞 vs 非阻塞 其他高级IO 非阻塞IOfcntl基于fcntl将文件描述符设置为非阻塞轮询方式读取标准输入 I/O多路转接之select初识selectselect函数原型参数timeout取值fd_set结构…

React Native中防止滑动过程中误触

React Native中防止滑动过程中误触 在使用React Native开发的时&#xff0c;当我们快速滑动应用的时候&#xff0c;可能会出现误触&#xff0c;导致我们会点击到页面中的某一些点击事件&#xff0c;误触导致页面元素响应从而进行其他操作,表现出非常不好的用户体验。 一、问题…

Kafka安装以及入门基本命令操作

文章目录 1.单节点搭建1.1 下载安装包1.2 配置环境变量1.3 配置配置文件1.4 启动启动zookeeper启动kafka 1.5 创建启动脚本startKafka.sh 2.简单的使用2.1 创建topic2.2 查看topic2.3 producer生产数据2.4 consumer消费者拉取数据 1.单节点搭建 1.1 下载安装包 #解压 tar -xz…

Android framework的底层原理,再不看就真有可能被淘汰

前言 从事Android开发的人都知道&#xff0c;目前市面上有各种类型跨平台技术诞生&#xff0c;严重冲击了Android市场&#xff0c;越来越多的Android开发者不再做移动应用开发&#xff0c;而另一方面&#xff0c;系统开发由于其复杂的逻辑&#xff0c;形成了独有的核心竞争力&…

Java 基础进阶篇(一)—— String 与 StringBuilder

文章目录 一、String 类概述二、String 创建对象的方式2.1 创建对象的两种方式2.2 面试&#xff1a;两种方式的区别 ★2.3 常见面试题 ★ 三、String 类常用方法3.1 字符串内容比较3.2 常用 API&#xff1a;遍历、截取、替换、分割 四、StringBuilder 字符串操作类4.1 构造器4.…

JavaScript 数据类型判断

&#xff08;生活的道路一旦选定&#xff0c;就要勇敢地走到底&#xff0c;决不回头。——左拉&#xff09; typeof typeof是在javascript编码过程中最常用的判断数据类型的方法&#xff0c;常用来判断数字&#xff0c;字符串&#xff0c;布尔值和undefind console.log(typeo…

ROS Noetic版本 rosdep找不到命令 不能使用的解决方法

使用rosdep指令来安装开源包所需的依赖是很方便的&#xff0c;本文主要介绍ROS Noetic版本中使用rosdep&#xff0c;报错找不到命令 &#xff0c;rosdep不能使用的解决方法。 rosdep&#xff1a;找不到命令 Command rosdep not found, but can be installed with:sudo apt ins…

怎么取消parallels更新,关闭Parallels Desktop 更新提示

自动更新问题 使用Parallels Desktop一段时间后&#xff0c;会主动提示更新&#xff0c;MacOS上最好的虚拟机&#xff1a;Parallels Desktop&#xff0c;但在使用过程中每次启动都要检查更新&#xff0c;比较烦人 如图&#xff1a; 解决方法 取消parallels更新 点击Parall…

v4l2框架

v4l2框架 文章目录 v4l2框架框架1.硬件相关层uvc_probeuvc_register_chainsuvc_register_termsuvc_register_video 2.核心层__video_register_device 3.虚拟视频驱动vivid分析入口vivid_init注册vivid平台驱动vivid_probevivid_create_instance 框架 1.硬件相关层 driver/medi…

2023 hnust 大三下 嵌入式 期中考试复习笔记

前言 ★&#xff1a;重点※&#xff1a;补充内容❓&#xff1a;还没搞懂的内容主要来源&#xff1a;教材、PPT、百度百科、AI重点来源&#xff1a;4-6班感谢&#xff1a;lyf总结得很草率&#xff0c;因为没听过课&#xff0c;也玩不懂 重点汇总 考试题型 选择&#xff08;40…