FreeRTOS任务的创建和删除(2)(基础知识)

主要内容

FreeRTOS任务的创建和删除。

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

本质是调用了freertos的API函数。
(1)动态创建任务:任务相关的任务控制块和任务栈空间所需要的内存,都是有freertos自动在堆中进行分配,不需要人为去分配。
(2)静态创建任务:任务相关的任务控制块和任务栈空间所需要的内存需要用户自己定义分配。

2.动态创建任务函数

在这里插入图片描述
动态创建任务函数有返回值:
在这里插入图片描述

(1)传递给任务函数的参数一般是NULL;

2.1动态创建任务流程

在这里插入图片描述

2.2任务控制块结构体成员

在这里插入图片描述
(1)任务控制块说白了就是任务的身份证,保留了任务的特征。
(2)任务栈顶,在任务切换和任务恢复息息相关。

2.3代码程序

(1)定义任务相关的堆栈大小、优先级、任务句柄等,函数声明等放在同一个位置,可以放在一个专门的.h文件中,方便后期进行管理。

#define START_TASK_STACK_SIZE 128
#define START_TASK_STACK_PRIO 1
TaskHandle_t start_task_handler;
void start_task( void * pvParameters );

在main()函数中,首先是初始化各种外设硬件,初始化完成后,调用xTaskCreate()创建任务,创建完任务后,打开调度函数vTaskStartScheduler();从而开始执行任务。

xTaskCreate((TaskFunction_t)	start_task,//任务函数	
				(const char *)      start_task,//任务名字
				(uint16_t) 			START_TASK_STACK_SIZE,//任务堆栈大小
				(void *)            NULL,//传递给任务函数的参数
				(UBaseType_t)       START_TASK_STACK_PRIO,//任务优先级
				(TaskHandle_t *)    &start_task_handler);//任务句柄
	vTaskStartScheduler();

3.静态创建任务函数

在这里插入图片描述
静态任务创建函数的返回值:
在这里插入图片描述

3.1静态态创建任务流程

在这里插入图片描述
(1)首先需要创建空闲任务,给任务分配堆栈内存和任务控制块。

StaticTask_t idla_task_tcb;//空闲任务的任务块
StackType_t idla_task_stack[configMINIMAL_STACK_SIZE]; 
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, 
									StackType_t **ppxIdleTaskStackBuffer, 
									uint32_t *pulIdleTaskStackSize )
{
	*ppxIdleTaskTCBBuffer = &idla_task_tcb;
	*ppxIdleTaskStackBuffer = idla_task_stack;
	*pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

(2)创建静态任务,需要自己申请堆栈和任务控制块

#define START_TASK_STACK_SIZE 128
#define START_TASK_STACK_PRIO 1
TaskHandle_t start_task_handler;
StackType_t start_task_stack[START_TASK_STACK_SIZE];
StaticTask_t start_task_tcb;
void start_task( void * pvParameters );

start_task_handler = xTaskCreateStatic(
(TaskFunction_t) start_task,
(char ) “start_task”,
(uint32_t) START_TASK_STACK_SIZE,
(void ) NULL,
(UBaseType_t) TASK2_STACK_PRIO,
(StackType_t
) start_task_stack,
(StaticTask_t
) &start_task_tcb );

(3)返回任务句柄,和动态定义稍有不同。

4.任务删除函数

在这里插入图片描述

用于删除已被删除的任务,被删除的任务将从四种状态中被删除。
(1)当传入的参数是NULL,则代表删除任务自身(当前执行的任务)。
(2)删除动态任务时,空闲任务会负责删除和释放任务中由系统分配的内存,但是由用户在任务删除前申请的内存,则需要用户在任务被删除前提前释放,否则会导致内存泄漏。

4.1删除任务流程

在这里插入图片描述

5.实验代码

实验创建了三个任务,task任务复杂创建task1和task2,1中进行闪灯,2中设置一个延时,等时间到了就删除1.代码附件。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值