【FreeRTOS】学习笔记(四)

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

FreeRTOS中任务的API包括:

  1. xTaskCreate():动态创建任务,任务的任务控制块以及任务的栈空间所需的内存,均由FreeRTOS从FreeRTOS管理的中分配
  2. xTaskCreateStatic():静态方式创建任务,任务的任务控制块以及任务的栈空间所需的内存,需用户分配提供
  3. vTaskDelete():删除任务

2 动态创建任务函数

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

2.1 使用API的准备

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

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

2.2 动态创建内部实现:

  1. 申请堆栈内存&任务控制块
  2. TCB结构体成员赋值
  3. 添加新任务到就绪列表中

2.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;

任务栈栈顶,在任务切换时的任务上下文保存、任务恢复息息相关
每个任务都有属于自己的任务控制块,类似身份证


3 静态创建任务函数

BaseType_t xTaskCreate
( 
		TaskFunction_t 					pxTaskCode,		/* 指向任务函数的指针 */
		const char * const 				pcName, 		/* 任务名字,最大长度configMax_TASK_NAME */
		const uint32_t					ulStackDepth,	/* 任务堆栈大小 */
		void * const 					pvParameters,	/* 传递给任务函数的参数 */
		UBaseType_t 					uxPriority,		/* 任务优先级,范围:0~configMAX_PRIORITIES - 1 */
		StackType_t * const				puxStackBuffer, /* 任务堆栈,一般为数组,由用户分配 */
		StackTask_t * const 			pxTaskBuffer 	/* 任务控制块指针,由用户分配 */
返回值描述
NULL用户没有提供相应的内存,任务创建失败
其他值任务句柄,任务创建成功

3.1 使用API的准备

  1. 需将宏configSUPPORT_STATIC_ALLOCATION配置为1
  2. 定义空闲任务&定时器任务的任务堆栈及TCB
  3. 实现两个接口函数:vApplicationGetIdleTaskMemory(),
  4. 定义函数入口参数
  5. 编写任务函数

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

3.2 静态创建内部实现:

  1. TCB结构体成员赋值
  2. 添加新任务到就绪列表

4 任务删除函数

void vTaskDelete(TaskHandle_t xTaskToDelete);
形参描述
xTaskToDelete待删除任务的任务句柄

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

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

4.1 使用API的准备

  1. 使用删除任务函数,需将宏INCLUDE_vTaskDelete配置为1
  2. 入口参数输入需要删除的任务句柄(NULL代表删除本身)

4.2 删除任务内部实现

  1. 获取所要删除任务的控制块:通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身
  2. 将被删除任务,移除所在列表:将该任务在所在列表中移除,包括:就绪、阻塞、挂起、事件等列表
  3. 判断所需要删除的任务:如果删除任务自身,需先添加到等待删除列表,内存释放将在空闲任务中执行;如果删除其他任务,释放内存,任务数量–
  4. 更新下个任务的阻塞时间:更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务
  • 25
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值