1.函数总括
FreeRTOS中有关任务的创建和删除相关的函数总共有4个,如下:
xTaskCreate():使用动态的方法创建一个任务,任务栈从FreeRTOS的堆中分配。
xTaskCreateStatic():使用静态的方法创建一个任务,任务栈需要用户提供。
xTaskCreateRestricted():创建一个使用MPU进行限制的任务,相关内存使用动态内存分配。
vTaskDelete():删除一个任务
2.函数详细介绍
(1)函数xTaskCreate()
此函数创建任务时,任务栈是从FreeRTOS中的堆中分配的,因此必须提供内存管理文件,默认使用heap_4.c内存管理文件,而且宏configSUPPORT_DYNAMIC_ALLOCATION必须为1。
函数原型如下:
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 任务函数
const char * const pcName, // 任务名字,它的长度不能超过configMAX_TASK_NAME_LEN
const uint16_t usStackDepth, // 任务栈大小,实际申请的栈时usStackDepth的4倍,空闲任务的任务栈大小为configMINIMAL_STACK_SIZE
void * const pvParameters, // 传递给任务函数的参数
UBaseType_t uxPriority, // 任务优先级,范围0~configMAX_PRIORITY-1
TaskHandle_t * const pxCreatedTask ) // 任务句柄
返回值:pdPASS–任务创建成功
errCOULD_NOT_ALLOCATION_REQUIRED_MEMORY–任务创建失败,因为堆内存不足
(2)函数xTaskCreateStatic()
此函数也是用来创建任务的,但是使用此函数时创建任务所需的RAM需要用户来提供。
如果要使用此函数,则需将宏configSUPPORT_STATIC_ALLOCATION定义为1,同时需要实现vApplicationGetIdleTaskMemory()和vApplicationGetTimerTaskMemory()这两个函数。
函数原型如下:
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 ) ; // 任务控制块
返回值:NULL–任务创建失败,puxStackBuffer或pxTaskBuffer为NULL的时候回导致这个错误发生。
其他值–任务创建成功,返回任务的任务句柄。
(3)函数xTaskCreateRestricted()
当MCU有MPU(内存保护单元)时,使用此函数创建任务。用此函数创建的任务会受到MPU的保护。其他的功能和函数xTaskCreate()一样。
函数原型如下:
BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, // 执向一个结构体TaskParameters_t,这个结构体描述了任务的任务函数、堆栈大小、优先级等,在文件task.h中有定义
TaskHandle_t * pxCreatedTask ) // 任务句柄
返回值:pdPASS–任务创建成功
其他值–任务未创建成功,很可能是因为FreeRTOS的堆太小了。
(4)函数vTaskDelete()
该函数删除用函数xTaskCreate()或者xTaskCreateStatic()创建的任务。
任务的删除其实就是任务不会再进入运行态了。
若任务是由xTaskCreate()创建的话,那么在此任务删除后,它申请的的堆栈和控制块内存会在空闲任务中被释放掉。因此在调用函数vTaskDelete()函数后,必须给空闲任务一定的运行时间。
只有那些由内核分配给任务的内存才会在任务被删除以后自动释放掉,用户分配给任务的内存需要用户自行释放掉。
函数原型如下:
void vTaskDelete( TaskHandle_t xTaskToDelete ) // 要删除的任务的任务句柄
返回值:无