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,在任務中由用戶手動分配的空間,需要由用戶自己手動釋放,否則會造成內存泄漏