FreeRTOS學習4-任務建立和刪除
關於任務建立有3個函式
1.動態建立一個任務。可以自動分配任務堆疊和TCB。FreeRTOSConfig.h中,需要定義
#define configSUPPORT_DYNAMIC_ALLOCATION 1 //支援動態記憶體申請
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,//函式指標,入口地址
const char * const pcName,//函式名字,自己取
const uint16_t usStackDepth,//堆疊大小,最後實際大小要*4
void * const pvParameters,//引數
UBaseType_t uxPriority,//優先順序,值越大,優先順序越高
TaskHandle_t * const pxCreatedTask )// 任務控制代碼
返回值:任務建立成功pdPASS;errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY任務建立失敗
2.靜態建立一個任務。需要手動分配堆疊大小和任務控制塊(TCB),像ucos一樣。
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,//堆疊指標,如在前面定義StackType_t TaskSTK[256];
StaticTask_t * const pxTaskBuffer )//任務控制塊指標,如定義StaticTask_t TaskTCB;
返回值:型別為TaskHandle_t,說明是任務控制代碼。
需要自己定義這2個任務的堆疊和TCB
static StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];//空閒任務任務堆疊
static StaticTask_t IdleTaskTCB;//空閒任務控制塊
static StackType_t TimerTaskStack[configTIMER_TASK_STACK_DEPTH];//定時器服務任務堆疊
static StaticTask_t TimerTaskTCB;//定時器服務任務控制塊
同時還需要對兩個函式進行定義:
//獲取空閒任務的堆疊和TCB地址
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, //二級TCB指標
StackType_t **ppxIdleTaskStackBuffer, //二級堆疊指標
uint32_t *pulIdleTaskStackSize)//堆疊大小
{ *ppxIdleTaskTCBBuffer=&IdleTaskTCB;
*ppxIdleTaskStackBuffer=IdleTaskStack;
*pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;}
//獲取定時器的堆疊和TCB地址
void vApplicationGetTimerTaskMemory(StaticTask_t **ppxTimerTaskTCBBuffer, //同上
StackType_t **ppxTimerTaskStackBuffer, //同上
uint32_t *pulTimerTaskStackSize)//同上
{ *ppxTimerTaskTCBBuffer=&TimerTaskTCB;
*ppxTimerTaskStackBuffer=TimerTaskStack;
*pulTimerTaskStackSize=configTIMER_TASK_STACK_DEPTH;}
3.建立一個有MPU(記憶體保護單元)的任務。其他功能和xTaskCreate建立的任務一樣
BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition, TaskHandle_t *pxCreatedTask )
TaskParameters_t 型別如下:
typedef struct xTASK_PARAMETERS
{
TaskFunction_t pvTaskCode;
const char * const pcName; //名字
uint16_t usStackDepth;//堆疊大小
void *pvParameters;//引數
UBaseType_t uxPriority;//優先順序
StackType_t *puxStackBuffer;//堆疊指標
MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ];
} TaskParameters_t;
typedef struct xMEMORY_REGION
{
void *pvBaseAddress;//基地址
uint32_t ulLengthInBytes;//大小
uint32_t ulParameters;//引數,這個是什麼引數,溢位引數嗎
} MemoryRegion_t;
TaskHandle_t 任務控制代碼型別。
刪除一個任務:
void vTaskDelete( TaskHandle_t xTaskToDelete ),會釋放掉堆疊和控制塊,該任務就相當於不存在了。
真正刪除任務是在空閒任務中,所以會有些延遲。