1. 程式人生 > >FreeRTOS學習4-任務建立和刪除

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 ),會釋放掉堆疊和控制塊,該任務就相當於不存在了。

真正刪除任務是在空閒任務中,所以會有些延遲。