1_xTaskCreate动态创建任务
如何动态创建一个任务?
[[#4 动态创建任务例子]]
1.开启功能
修改配置文件:FreeRTOSconfig.h
//配置支持动态分配
#define configSUPPORT_DYNAMIC_ALLOCATION 1
2.函数接口
函数定义头文件:task.h
//动态创建任务函数声明
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,//任务函数名
const char * const pcName,//任务的名称
unsigned short usStackDepth,//任务堆栈大小
void *pvParameters,
UBaseType_t uxPriority,//任务优先级
TaskHandle_t *pxCreatedTask//任务句柄
);
3.函数参数与返回值说明
参数:
-
pxTaskCode (函数名):
任务函数必须是无法返回的,即无return且内含无限循环 -
pcName (名称):
任务名称字符串,只是方便调试时使用的,
字符串长度包含’\0’,最大长度由宏定义configMAX_TASK_NAME_LEN决定
字符串超出长度自动则以’\0’截断 -
usStackDepth (堆栈大小):
任务堆栈的大小,实际申请到的内存空间为usStackDepth的4倍
任务函数占用的内存大小不可以超过这个任务栈申请到的内存空间。
空闲任务的堆栈大小由宏定义configMINIMAL_STACK_SIZE决定,可以根据需求更改其大小
任务所需栈空间,一般都是估算后取较大值防止溢出,但是这样可能会导致不必要的内存浪费
等学到后面就可以调试来查看任务执行过程中的内存占用情况,再来取一个合理的值。
-
pvParameters(参数):
需要传递给任务函数的参数,如同mian函数的参数一样,
通过这个参数可以实现对任务采用不同的模式等。 -
uxPriority(优先级):
0是最低优先级,最高优先级是configMAX_PRIORITIES-1
configMAX_PRIORITIES是任务优先级个数宏定义常量 -
pxCreatedTask(任务句柄):
任务句柄可以引索到任务任务的堆栈,是指向任务控制块的指针
后面所有对任务的操作都需要通过这个句柄。
返回值:
- 返回 1 (pdPASS):
表明任务创建成功 - 返回 0 (pdFAIL):
表示任务创建失败,表明任务没有创建,因为可供FreeRTOS使用的内存堆空间不足,
无法分配任务堆栈所需要的空间,保存不了任务数据结构和任务栈,所以任务创建失败了。
4.动态创建任务例子
任务定义:
//放在.h头文件的一些声明接口
#define TASK_HARDWAVE_INIT_STACK_SIZE 512//宏定义任务堆栈大小(单位*4byte)
#define TASK_HARDWAVE_INIT_TASK_PRIORITY 5//宏定义任务优先级
void task_hardwave_init(void *pvParameters);//任务函数声明
extern TaskHandle_t Handler_hardwave_init;//声明任务句柄全局变量
//句柄变量定义应放在.c文件
TaskHandle_t Handler_hardwave_init;//定义任务句柄全局变量
任务创建:
//创建硬件初始化任务
xTaskCreate(
task_hardwave_init,
"hardwave_init",
TASK_HARDWAVE_INIT_STACK_SIZE,
NULL,
TASK_HARDWAVE_INIT_TASK_PRIORITY,
&Handler_hardwave_init
);