FreeRTOS 任务创建与删除(内部分配栈)

#include "freertos_demo.h"
#include "./BSP/KEY/key.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/usart/usart.h"
/*FreeRTOS*********************************************************************************************/
#include "FreeRTOS.h"
#include "task.h"

#define STARTTASKSTACKSIZE 128
#define STARTTASKPRIO 1
TaskHandle_t StartTaskHandle;

#define TASK1STACKSIZE 128
#define TASK2STACKSIZE 128
#define TASK3STACKSIZE 128

#define TASK1PRIO 2
#define TASK2PRIO 3
#define TASK3PRIO 4

TaskHandle_t Task1Handle;
TaskHandle_t Task2Handle;
TaskHandle_t Task3Handle;

void Task1Code(void* pvParameters)
{
    for (;;)
    {
        printf("任务1运行中.\n");
        LED0_TOGGLE();
        vTaskDelay(500);
    }
}
void Task2Code(void* pvParameters)
{
    for (;;)
    {
        printf("任务2运行中.\n");
        LED1_TOGGLE();
        vTaskDelay(500);
    }
}
void Task3Code(void* pvParameters)
{
    static uint8_t key_num = 0;
    for (;;)
    {
        key_num = key_scan(0);
        if (key_num == KEY0_PRES && Task1Handle != NULL)
        {
            printf("删除task1.\n");
            vTaskDelete(Task1Handle);
            Task1Handle = NULL;
        }
        else if (key_num == KEY1_PRES && Task2Handle != NULL)
        {
            printf("删除task2.\n");
            vTaskDelete(Task2Handle);
            Task2Handle = NULL;
        }else if(key_num == KEY2_PRES && Task2Handle == NULL && Task1Handle == NULL)
        {
            printf("重新创建任务.\n");
            xTaskCreate(Task1Code, "Task1", TASK1STACKSIZE, NULL, TASK1PRIO, &Task1Handle);
            xTaskCreate(Task2Code, "Task2", TASK2STACKSIZE, NULL, TASK2PRIO, &Task2Handle);
        }
        vTaskDelay(10);
    }
}

void StartTaskCode(void* pvParameters)
{
    xTaskCreate(Task1Code, "Task1", TASK1STACKSIZE, NULL, TASK1PRIO, &Task1Handle);
    xTaskCreate(Task2Code, "Task2", TASK2STACKSIZE, NULL, TASK2PRIO, &Task2Handle);
    xTaskCreate(Task3Code, "Task3", TASK3STACKSIZE, NULL, TASK3PRIO, &Task3Handle);
    vTaskDelete(NULL);
}

void freertos_demo(void)
{
    xTaskCreate(StartTaskCode, "StartTask", STARTTASKSTACKSIZE, NULL, STARTTASKPRIO, &StartTaskHandle);
    vTaskStartScheduler();
}

学习了任务调度的方法 不是并行 任务阻塞时 低优先级任务执行
动态创建任务 FreeRTOS自己在堆中分配任务栈内存 优先级数字越大优先级越高 需要开启任务调度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值