FreeRTOS任务创建删除

FreeRTOS 当前使用的api 接口为

xTaskCreate()
xTaskCreateRestricted()
xTaskCreateStatic()
vTaskDelete()

 xTaskCreate() 函数原型

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,      
             const char * const pcName,      
             const uint16_t usStackDepth,     
             void * const pvParameters,      
             UBaseType_t uxPriority,        
               TaskHandle_t * const pxCreatedTask )

 pxTaskCode : 实现任务的主要功能的函数,其返回值是void 类型,参数是void * 类型

const pcName:任务名,其长度由宏 configMAX_TASK_NAME_LEN 决定,一般16
StackDepth : 堆栈的大小设置。实际大小是该值4倍,因为它是4字节大小。
pvParameters :需要传递给任务的参数,
uxPriority : 任务优先级,范围:0-configMAX_PRIORITIES
pxCreatedTask :创建成功后的任务句柄保存在这个参数里面,供其他API 使用。比如任务删除

创建成功后,返回值为: pdPASS.   其他则为失败,可能的原因堆内存分配失败。

由于任务需要ram 来进行堆栈的分配和存储,这部分自动从FreeRTOS 的堆中分配。由于这个函数需要系统来帮助任务做这些处理所以需要freertos 提供内存管理和分配,因此对于freeRTOS 来说需要提供一个内存管理文件,如heap_x.c ,同时宏configSUPPORT_DYNAMIC_ALLOCATION 需要定义为1.

xTaskCreateStatic() 函数原型

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 )

pxTaskCode: 要实现的任务的功能函数,返回类型void, 参数类型: void *

pcName: 任务的名字

ulStackDepth: 堆栈的大小,实际大小是该值的4倍,因为其对应的是int型大小字节空间

pvParameters: 传递给任务的参数

uxPriority: 优先级。范围:0-configMAX_PRIORITIES

puxStackBuffer: 堆栈空间,这是由用户指定的,一般就是一个数组,数组的大小就是上面ulStackDepth值。类型

        为StackType_t 类型。

pxTaskBuffer: 任务控制块。

任务创建成功,返回任务句柄。

从参数上可以看出上面两个函数区别,static 类型的任务创建,需要用户手动指定堆栈,同时,增加了一个任务控制块。


xTaskCreateRestricted() 函数原型

BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )

这个函数创建的任务会受到MPU的保护,所以要求对应的mcu有MPU(内存保护单元), 除此以外,其他功能就和xTaskCreate 一样了

vTaskDelete() 函数原型

void vTaskDelete( TaskHandle_t xTaskToDelete )

用于删除一个由上面的xTaskCreate 和 xTaskCreateStatic创建的函数

调用次函数之后需要注意一些事项,

1,调用次函数之后,任务就不存在了,此时任务所占用的内存相关空间会在idle 任务运行时给释放,因此

  需要给idle 任务一定的运行时间。

2,在任务中由用户手动分配的空间,需要由用户自己手动释放,否则会造成内存泄漏

原文地址:https://www.cnblogs.com/yunxiangworld/p/8029008.html