52Hz——FreeRTOS学习笔记——删除任务
主要API
xTaskDelete
INCLUDE_vTaskDelete
必须定义为 1,才可使用此函数。
总结
参数
xTaskToDelete: 要删除的任务的句柄。如果传递 NULL,则删除调用此函数的任务自身。
功能描述
删除一个任务,并将其从所有内部列表(就绪列表、阻塞列表、挂起列表等)中移除。
被删除任务的内存(包括任务控制块 TCB 和任务栈)需要被释放。如果任务是由
xTaskCreate()
动态创建的,那么内核会在删除任务时自动释放内存。如果任务是由xTaskCreateStatic()
静态创建的,则不会自动释放内存,需要用户自行管理。删除任务时,会调用任务的清除钩子函数(如果设置了的话),然后释放内存。
案例
#include "MyTask.h"typedef enum
{TASK_PRIORITY_0,TASK_PRIORITY_1,TASK_PRIORITY_2,TASK_PRIORITY_3,TASK_PRIORITY_4
} Task_Priority_t;void LED1_Task(void *pvParameters);
TaskHandle_t led1_task_handle;
#define LED1_TASK_NAME "LED1_Task"
#define LED1_TASK_STACK_DEPTH 128void LED2_Task(void *pvParameters);
TaskHandle_t led2_task_handle;
#define LED2_TASK_NAME "LED2_Task"
#define LED2_TASK_STACK_DEPTH 128void LED3_Task(void *pvParameters);
TaskHandle_t led3_task_handle;
#define LED3_TASK_NAME "LED3_Task"
#define LED3_TASK_STACK_DEPTH 128void KEY_Task(void *pvParameters);
TaskHandle_t KEY_task_handle;
#define KEY_TASK_NAME "KEY_Task"
#define KEY_TASK_STACK_DEPTH 128void Init_Task(void *pvParameters);
TaskHandle_t Init_task_handle;
#define Init_TASK_NAME "Init_Task"
#define Init_TASK_STACK_DEPTH 128void MyTask_Start_Work(void)
{// 1. 创建任务xTaskCreate(Init_Task, Init_TASK_NAME, Init_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &Init_task_handle);// 2. 开启调度器vTaskStartScheduler();
}void LED1_Task(void *pvParameters)
{while (1){Int_LED_Toggle(LED1_GPIO_Port, LED1_Pin);vTaskDelay(1000);}
}void LED2_Task(void *pvParameters)
{while (1){Int_LED_Toggle(LED2_GPIO_Port, LED2_Pin);vTaskDelay(1000);}
}void LED3_Task(void *pvParameters)
{while (1){Int_LED_Toggle(LED3_GPIO_Port, LED3_Pin);vTaskDelay(1000);}
}void KEY_Task(void *pvParameters)
{while (1){Key_Type KEY = Int_Key_Scan();switch (KEY){case KEY1:vTaskDelete(led1_task_handle);break;case KEY2:vTaskDelete(led2_task_handle);break;case KEY3:vTaskDelete(led3_task_handle);break;default:break;}}
}void Init_Task(void *pvParameters)
{xTaskCreate(LED1_Task, LED1_TASK_NAME, LED1_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &led1_task_handle);xTaskCreate(LED2_Task, LED2_TASK_NAME, LED2_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &led2_task_handle);xTaskCreate(LED3_Task, LED3_TASK_NAME, LED3_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &led3_task_handle);xTaskCreate(KEY_Task, KEY_TASK_NAME, KEY_TASK_STACK_DEPTH, NULL, TASK_PRIORITY_4, &KEY_task_handle);/* 一次性任务,执行完以后要自行删除 */vTaskDelete(NULL);
}