FreeRTOS-00-基础知识+任务创建删除 (3)

函数原型:

#include "FreeRTOS.h" #include "task.h" BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const char * const pcName, const configSTACK_DEPTH_TYPE usStackDepth, void * const pvParameters, UBaseType_t uxPriority, TaskHandle_t * const pxCreatedTask );

描述:使用动态方法创建一个任务,任务控制块和任务堆栈在函数内创建。最新创建的任务初始化为就绪态,如果当前没有更高优先级的任务运行,则立刻变为运行态。

函数参数说明:

参数名 说明
pxTaskCode   任务函数,通常为一个无限循环。  
pcName   任务名字,名称长度有限制,在FreeRTOSConfig.h中有定义configMAX_TASK_NAME_LEN。  
usStackDepth   任务堆栈大小,实际申请到的堆栈是usStackDepth的4倍。configMINIMAL_STACK_SIZE定义的是空闲任务堆栈大小。  
pvParameters   传递给任务函数的参数  
uxPriority   任务优先级,范围0~configMAX_PRIORITIES-1。  
pxCreatedTask   任务句柄,任务创建成功以后会返回此任务的任务句柄, 这个句柄其实就是 任务的任务堆栈。 此参数就用来保存这个任务句柄。其他 API 函数可能会使 用到这个句柄。如果任务句柄不需要使用,可以被设置为NULL。  

返回值:

pdPASS:任务创建成功。
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY: 任务创建失败,因为堆内存不足!

3.2 任务创建函数(静态方法)

函数原型:

#include "FreeRTOS.h" #include "task.h" 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 );

描述:使用静态方法创建一个任务。任务所需要的RAM需要用户来提供。

函数参数说明:

参数名 说明
pxTaskCode   任务函数,通常为一个无限循环。  
pcName   任务名字,名称长度有限制,在FreeRTOSConfig.h中有定义configMAX_TASK_NAME_LEN。  
usStackDepth   任务堆栈大小,静态创建任务的堆栈由用户给出,通常为一个数组,这个参数就是数组的大小。  
pvParameters   传递给任务函数的参数  
uxPriority   任务优先级,范围0~configMAX_PRIORITIES-1。  
puxStackBuffer   任务堆栈,一般为数组,数组类型为StackType_t类型。  
pxTaskBuffer   任务控制块  

返回值:

NULL:任务创建失败,puxStackBuffer或pxTaskBuffer为空。
其他值: 任务创建成功,返回任务的任务句柄。

3.3 任务删除API函数

函数原型:

void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;

描述:删除任务,删除之后的任务不再存在,也不能再使用此函数的句柄。如果任务使用的是xTaskCreate()创建的,此任务被删除后此任务之前申请的堆栈和控制块内存会在任务中被释放掉。

函数参数:xTaskToDelete要删除的任务的任务句柄。

返回值:

3.4 任务创建和删除实验(动态方法)

创建两个任务,这两个任务的功能如下:

task00:此任务每个1000ms打印一次字符串,调用5次之后调用vTaskDelete()函数删除task01。

task01:此任务为普通任务,间隔500ms打印一次字符串,和task00同样的任务优先级。

task00任务创建代码:

configSTACK_DEPTH_TYPE Task00_STACK_SIZE = 5; UBaseType_t Task00_Priority = 1; TaskHandle_t Task00_xHandle; void vTask00_Code(void *para) { static unsigned int cnt = 0; for (;;) { PRINT(" task00 cnt %u...", cnt); if (cnt == 4) vTaskDelete(Task01_xHandle); cnt++; vTaskDelay(1000); } } xTaskCreate(vTask00_Code, "task00", Task00_STACK_SIZE, NULL, Task00_Priority, &Task00_xHandle);

task01任务创建代码:

configSTACK_DEPTH_TYPE Task01_STACK_SIZE = 5; UBaseType_t Task01_Priority = 1; TaskHandle_t Task01_xHandle; void vTask01_Code(void *para) { static unsigned int cnt = 0; for (;;) { PRINT(" task01 cnt %u...", cnt); cnt++; vTaskDelay(500); } } xTaskCreate(vTask01_Code, "task01", Task01_STACK_SIZE, NULL, Task01_Priority, &Task01_xHandle);

编译,运行,测试结果符合预期,task00运行5秒之后删除了task01:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsspy.html