FreeRTOS学习(五)

静态创建和删除任务

 将宏ConfigSUPPORT_STATIC_ALLOCATION配置为1。

#define ConfigSUPPORT_STATIC_ALLOCATION 1

实现两个接口函数vApplicationGetIdleTaskMemory()以及vApplicationGetTimerTaskMemory()。即申请分配空闲任务内存以及定时器任务内存(若不使用定时器则无需申请定时器任务内存)。

StaticTask_t idle_task_tcb;
StackType_t idle_task_stack[configMINIMAL_STACK_SIZE];

StaticTask_t timer_task_tcb;
StackType_t timer_task_stack[configTIMER_TASK_STACK_DEPTH];

void vApplicationGetIdleTaskMemory(StaticTask_t** ppxIdleTaskTCBBuffer, 
                                   StackType_t** ppxIdleTaskStackBuffer, 
                                   uint32_t* pulIdleTaskStackSize)
{
    *ppxIdleTaskTCBBuffer = &idle_task_tcb;
    *ppxIdleTaskStackBuffer = idle_task_stack;
    *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
}

void vApplicationGetTimerTaskMemory(StaticTask_t** ppxTimerTaskTCBBuffer, 
                                   StackType_t** ppxTimerTaskStackBuffer, 
                                   uint32_t* pulTimerTaskStackSize)
{
    *ppxTimerTaskTCBBuffer = &timer_task_tcb;
    *ppxTimerTaskStackBuffer = timer_task_stack;
    *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
}

创建任务方法。

#define START_TASK_STACK_SIZE 128
#define START_TASK_PRIORITY 1

#define START_TASK1_STACK_SIZE 128
#define START_TASK1_PRIORITY 2
#define START_TASK2_STACK_SIZE 128
#define START_TASK2_PRIORITY 3
#define START_TASK3_STACK_SIZE 128
#define START_TASK3_PRIORITY 4

void start_task(void* pvParameters);

void task1(void* pvParameters);
void task2(void* pvParameters);
void task3(void* pvParameters);

StackType_t start_task_stack[START_TASK_STACK_SIZE];
StaticTask_t start_task_tcb; 

StackType_t task1_stack[START_TASK1_STACK_SIZE];
StaticTask_t task1_tcb; 
StackType_t task2_stack[START_TASK2_STACK_SIZE];
StaticTask_t task2_tcb; 
StackType_t task3_stack[START_TASK3_STACK_SIZE];
StaticTask_t task3_tcb; 

TaskHandle_t start_task_handler;

TaskHandle_t task1_handler;
TaskHandle_t task2_handler;
TaskHandle_t task3_handler;

void freertos_demo(void)
{
    /*创建任务start_task*/
    start_task_handler = xTaskCreate(start_task, 
                                     "start_task",
                                     START_TASK_STACK_SIZE, 
                                     NULL, 
                                     START_TASK_PRIORITY, 
                                     start_task_stack, 
                                     &start_task_tcb);
    /*开启任务调度器*/
    vTaskStartScheduler();
}

void start_task(void* pvParameters)
{
    /*进入临界区*/
    taskENTER_CRITICAL;    

    /*创建任务task1*/
    task1_handler = xTaskCreate(task1, 
                                "task1",
                                 START_TASK1_STACK_SIZE, 
                                 NULL, 
                                 START_TASK1_PRIORITY, 
                                 task1_stack, 
                                 &task1_tcb);

     /*创建任务task2*/
     task2_handler = xTaskCreate(task2, 
                                "task2",
                                 START_TASK2_STACK_SIZE, 
                                 NULL, 
                                 START_TASK2_PRIORITY, 
                                 task2_stack, 
                                 &task2_tcb);

     /*创建任务task3*/
     task3_handler = xTaskCreate(task3, 
                                "task3",
                                 START_TASK3_STACK_SIZE, 
                                 NULL, 
                                 START_TASK3_PRIORITY, 
                                 task3_stack, 
                                 &task3_tcb);

     /*删除任务 防止start_task多次创建Task1、Task2、Task3使得超出FreeRTOS提供的堆栈大小*/
     vTaskDelete(NULL);
     //vTaskDelete(start_task_handler);

     /*退出临界区*/
     taskEXTI_CRITICAL;  
}

/*LED0每500ms翻转一次*/
void task1(void* pvParameters)
{
    while(1)
    {
        LED0_TOGGLE();
        vTaskDelay(500); //系统延时函数
    }
}

/*LED1每500ms翻转一次*/
void task2(void* pvParameters)
{
    while(1)
    {
        LED1_TOGGLE();
        vTaskDelay(500); //系统延时函数
    }
}

/*判断按键KEY0 按下按键则删除KEY0*/
void task3(void* pvParameters)
{
    uint8_t key = 0;

    while(1)
    {
        key = key_scan(0);

        if(key = KEY0_PRES)
        {
            if(task1_handler != NULL)
            {
                vTaskDelete(task1_handler);
                task1_handler = NULL;
            }
        }
        vTaskDelay(10);
    }
}

动态静态创建任务以及删除任务总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值