1、多任务创建
本文来讲一下在FreeRTOS中的多任务创建,以及如何删除任务。之前已经讲到使用xTaskCreate函数来创建任务,
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务
其中该函数的返回值意义如下,
成功时返回 pdPASS,
失败时返回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(失败原因是内存不足)。
接下来来讲一下另外一种,任务创建函数,使用静态分配内存的函数。
TaskHandle_t xTaskCreateStatic (
TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const uint32_t ulStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
StackType_t * const puxStackBuffer, // 静态分配的栈,就是一个buffer
StaticTask_t * const pxTaskBuffer // 静态分配的任务结构体的指针,用它来操作这个任务
);
与xTaskCreate相比,xTaskCreateStatic函数的最后两个参数有所不同,而且该函数的返回值为该函数的函数句柄。具体如下:
其实多任务的创建和单任务的创建一样,直接创建就行,不需要有额外操作。
2、任务的删除
至于一个任务的删除,我们通常使用vTaskDelete函数
void vTaskDelete( TaskHandle_t xTaskToDelete );
值得注意的是,如果想在一个任务里面杀死本任务,可以用vTaskDelete(NULL),这个也叫自杀,当然要想杀死其他任务,可以用vTaskDelete(pvTaskCode),其中pvTaskCode是要杀死的任务的句柄。其实删除任务的函数我们并不常用,因为不断的创建删除函数会使我们的内存碎片化,甚至到最后可能没有内存可分配,所以想要结束一个任务,我们大多在任务函数内部进行实现,并不直接杀死一个任务。