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,在任务中由用户手动分配的空间,需要由用户自己手动释放,否则会造成内存泄漏