FreeRTOS动态创建任务和删除任务

#define Start_Stack_Size 120    //任务堆栈大小
#define Start_Task_Prio  1      //任务优先级       0和31分别是空闲任务和软件定时器优先级,用户不能用
TaskHandle_t Start_Task_Handle; //任务句柄
void Start_Task( void * pvParameters );  //开始任务任务函数声明

#define Task1_Stack_Size 50
#define Task1_Prio       2
TaskHandle_t Task1_Handle;
void Task1_LED0( void * pvParameters );  //任务1函数声明

#define Task2_Stack_Size 50
#define Task2_Prio       2
TaskHandle_t Task2_Handle;
void Task2_LED1( void * pvParameters );  //任务2函数声明
    
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4     0-15一共16级优先级
    delay_init();                        //延时函数初始化      
    uart_init(115200);                    //初始化串口
    LED_Init();                              //初始化LED
    
    xTaskCreate(    (TaskFunction_t) Start_Task,            //任务函数名
                    (const char*   ) "Start_Task",            //任务名称
                    (uint16_t      ) Start_Stack_Size,         //任务堆栈大小
                    (void *        ) NULL,                     //传递给任务函数的参数
                    (UBaseType_t   ) Start_Task_Prio,          //任务优先级
                    (TaskHandle_t *) &Start_Task_Handle );  //任务句柄
                    
    vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void Start_Task( void * pvParameters )
{
    //创建任务1
    xTaskCreate(    (TaskFunction_t) Task1_LED0,            //任务函数名
                    (const char*   ) "Task1_LED0",            //任务名称
                    (uint16_t      ) Task1_Stack_Size,         //任务堆栈大小
                    (void *        ) NULL,                     //传递给任务函数的参数
                    (UBaseType_t   ) Task1_Prio,              //任务优先级
                    (TaskHandle_t *) &Task1_Handle );       //任务句柄
    
    //创建任务2                    
    xTaskCreate(    (TaskFunction_t) Task2_LED1,            //任务函数名
                    (const char*   ) "Task2_LED1",            //任务名称
                    (uint16_t      ) Task2_Stack_Size,         //任务堆栈大小
                    (void *        ) NULL,                     //传递给任务函数的参数
                    (UBaseType_t   ) Task2_Prio,              //任务优先级
                    (TaskHandle_t *) &Task2_Handle );       //任务句柄
                    
    vTaskDelete(Start_Task_Handle); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//任务1任务函数
void Task1_LED0( void * pvParameters )
{
    u8 count = 0;
    while(1)
    {
        count++;
        printf("任务1执行了%d次\r\n", count);
        if(count == 5)
        {
            printf("任务1被删除了!\r\n");
            vTaskDelete(Task1_Handle);   //删除任务1
            //printf("任务1被删除了!\r\n");
        }
        LED0 = !LED0;
        vTaskDelay(500);
    }
}

//任务2任务函数
void Task2_LED1( void * pvParameters )
{
    u16 count = 0;
    while(1)
    {
        count++;
        printf("任务2执行了%d次\r\n", count);
        LED1 = 0;
        vTaskDelay(300);
        LED1 = 1;
        vTaskDelay(800);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值