freertos学习之路6-任务创建和删除

写在最前

由于工作需要,需要开始学习freertos的相关知识,本专题主要记录freertos的相关内容

参考:

https://www.bilibili.com/video/BV19g411p7UT 正点原子视频

1. 简介

和一般的OS不同(linux/windows),在freertos中,每个执行线程都被称为任务,freertos任务创建和删除的本质就是调用相关的API函数去实现

API函数描述
xTaskCreate()动态方式创建任务
xTaskCreateStatic()静态方式创建任务
vTaskDelete()删除任务

2. 任务控制块TCB介绍

学过操作系统的都知道,进程有个PCB来存储进程的各种信息,这里的TCB类似,每个任务都有属于自己的任务控制块,类似于我们人的身份证,它是由一个c语言的结构体实现

typedef struct tskTaskControlBlock       
{
    volatile StackType_t 		* pxTopOfStack; 					
   	ListItem_t 					xStateListItem;           				  
	ListItem_t 					xEventListItem;					 
    UBaseType_t 				uxPriority;                					
    StackType_t 				* pxStack;						
    char 				pcTaskName[ configMAX_TASK_NAME_LEN ]; 		
	…
	省略很多条件编译的成员
} tskTCB;

成员

  • pxTopOfStack:一个指针指向任务栈栈顶,必须为TCB的第一个成员,在任务切换时的任务上下文保存、任务恢复息息相关

  • xStateListItem:任务状态列表项,你当前任务处于什么状态,就绪态/堵塞态/挂起态

  • xEventListItem:任务事件列表项,

  • uxPriority:任务优先级,数值越大,优先级越大

  • pxStack:指针指向任务栈起始地址

  • pcTaskName[ configMAX_TASK_NAME_LEN ]; :任务名字

3. 动态创建任务函数

3.1 函数介绍

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 	/* 任务句柄,就是任务的任务控制块 */
)

参数

  • pxTaskCode:指向任务函数的指针
  • pcName:任务名字,最大长度configMAX_TASK_NAME_LEN
  • usStackDepth:任务堆栈大小,注意字为单位,系统自动分配
  • pvParameters:传递给任务函数的参数,一般设置为NULL
  • uxPriority:任务优先级,范围:0 ~ configMAX_PRIORITIES - 1
  • pxCreatedTask:任务句柄,就是任务的任务控制块

返回值

  • 成功:pdPASS
  • 失败:errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY,可能是因为你申请的堆栈实在时太大了

3.2 动态任务创建

3.2.1 实践操作
  1. 将宏configSUPPORT_DYNAMIC_ALLOCATION配置为 1
  2. 定义函数入口参数
  3. 编写任务函数

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

3.2.2 内核实现流程
  1. 申请堆栈内存&任务控制块内存
  2. TCB结构体成员赋值
  3. 添加新任务到就绪列表中(就绪态)

4. 静态创建任务

3.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:传递给任务函数的参数,一般设置为NULL
  • uxPriority:任务优先级,范围:0 ~ configMAX_PRIORITIES - 1
  • puxStackBuffer:任务堆栈,一般为数组,由用户分配
  • pxTaskBuffer:任务控制块指针,由用户分配

返回值

  • 成功:其他值,任务句柄,任务创建成功
  • 失败:NULL,用户没有提供相应的内存,任务创建失败

3.2 静态创建任务使用流程

3.2.1 实践操作
  1. 需将宏configSUPPORT_STATIC_ALLOCATION 配置为 1
  2. 定义空闲任务&定时器任务的任务堆栈及TCB
  3. 实现两个接口函数(vApplicationGetIdleTaskMemory( )vApplicationGetTimerTaskMemory ( ))
  4. 定义函数入口参数
  5. 编写任务函数
3.2.2 内核实现
  1. TCB结构体成员赋值
  2. 添加新任务到就绪列表中

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

5. 删除任务

5.1 任务删除函数

void vTaskDelete(TaskHandle_t xTaskToDelete);

作用:

用于删除已被创建的任务,被删除的任务将从就绪态任务列表、阻塞态任务列表、挂起态任务列表和事件列表中移除

参数:

xTaskToDelete:待删除任务的任务句柄

注意:

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

5.2 任务删除流程

5.2.1 实践操作
  1. 使用删除任务函数,需将宏INCLUDE_vTaskDelete 配置为 1
  2. 入口参数输入需要删除的任务句柄(NULL代表删除本身)
5.2.2 内核实现流程
  1. 获取所要删除任务的控制块:通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身

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

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

    1. 删除任务自身,需先添加到等待删除列表,内存释放将在空闲任务执行
    2. 删除其他任务,释放内存,任务数量–
  4. 更新下个任务的阻塞时间:更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务

总结

本文主要简要介绍了freertos的任务的创建和删除的实现,包括实践和内核,以及TCB介绍,属于纯理论部分,并未涉及任何实践操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS是一个用于嵌入式系统的实时操作系统。在FreeRTOS中,任务是系统中最基本的执行单位。下面是关于FreeRTOS任务创建和使用的一些基本信息: 1. 在FreeRTOS创建任务的步骤如下: - 使用xTaskCreate()函数创建任务,指定任务函数、任务名称、堆栈大小和优先级等参数。 - 在任务函数中定义任务的行为和逻辑。 - 使用vTaskStartScheduler()函数启动调度器,开始任务调度。 2. 任务函数的定义: - 任务函数是一个无返回值、无参数的函数,它将在任务创建后立即执行。 - 任务函数应该包含一个无限循环,以便任务能够不断地执行。 3. 任务的优先级: - FreeRTOS使用优先级来确定任务的执行顺序。具有较高优先级的任务将在具有较低优先级的任务之前执行。 - 可以使用宏定义configMAX_PRIORITIES来定义系统支持的最大优先级数。 4. 任务挂起和恢复: - 可以使用vTaskSuspend()函数将任务挂起,使其暂停执行。 - 可以使用vTaskResume()函数恢复被挂起的任务,使其继续执行。 5. 任务删除: - 可以使用vTaskDelete()函数删除一个已经创建任务。 这些是FreeRTOS任务创建和使用的基本知识。在实际应用中,还可以使用其他FreeRTOS提供的功能和API来管理和控制任务的执行。请注意,具体的实现细节可能会因为不同的系统和编译器而有所差异,建议参考FreeRTOS官方文档和示例代码进行更详细的学习和了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值