FreeRTOS学习4-任务创建和删除

版权声明: https://blog.csdn.net/tangjienihaoma/article/details/81739099

关于任务创建有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 ),会释放掉堆栈和控制块,该任务就相当于不存在了。

真正删除任务是在空闲任务中,所以会有些延迟。

猜你喜欢

转载自blog.csdn.net/tangjienihaoma/article/details/81739099
今日推荐