FreeRTOS的任务删除并不常用,下面把有任务删除部分的代码贴出来:
//**************************************************************
// 具体任务函数
//函数名:Start_Task
//**************************************************************
void Start_Task(void *pvParameters)
{
//创建任务1:
xTaskCreate((TaskFunction_t) Task1, //任务函数名
(const char *) "Task1", //任务名称(随便取)
(uint16_t) TASK1_SIZE, //任务堆栈大小
(void *) NULL, //任务参数,一般为空
(UBaseType_t) TASK1_PRIO, //任务优先级
(TaskHandle_t *) &Task1_Handler); //任务句柄
//创建任务2:
xTaskCreate((TaskFunction_t) Task2, //任务函数名
(const char *) "Task2", //任务名称(随便取)
(uint16_t) TASK2_SIZE, //任务堆栈大小
(void *) NULL, //任务参数,一般为空
(UBaseType_t) TASK2_PRIO, //任务优先级
(TaskHandle_t *) &Task2_Handler); //任务句柄
vTaskDelete(Start_Task_Handler); //创建其它任务后,删除自己,参数为待删除任务的任务句柄
//vTaskDelete(NULL); //如果任务在任务函数中删除自己,也可以将参数写为"NULL",就像这个里面一样。
}
下面我参照正点原子写的,里面有任务删除过程,上面那段代码就是摘自这个里面:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
//本例程大体结构:
//例程主要学习任务的动态创建,先是创建一个开始创建任务的任务,然后在这个任务里面又创建另外两个任务.
//任务创建的步骤:
//1、大体构思任务框架;
//2、准备好任务创建函数:"xTaskCreate();"
//3、将任务创建函数"xTaskCreate()"里面的参数都准备好填进去,
// 任务参数就是:任务函数的函数名、任务名、堆栈、优先级、句柄;
//4、编写任务的具体函数,函数体内搞个大循环,剩下的就是具体的功能了;
//5、一切准备好后,开启任务调度器.
//====================开始任务函数相关========================
void Start_Task(void *pvParameters);//任务函数声明
#define START_TASK_SIZE 120 //任务堆栈大小
#define START_TASK_PRIO 1 //任务优先级,注意,优先级“0”不能用,这个是空闲任务的优先级,
//空闲任务在开启任务调度器中会自动创建
//还有一个软件定时器任务,这个任务优先级是最高的31,这个也不能用
TaskHandle_t Start_Task_Handler; //任务句柄
//========================任务1相关========================
void Task1(void *pvParameters); //任务函数声明
#define TASK1_SIZE 120 //任务堆栈大小
#define TASK1_PRIO 2 //任务优先级,注意,优先级“0”不能用,这个是空闲任务的优先级,
//空闲任务在开启任务调度器中会自动创建
//还有一个软件定时器任务,这个任务优先级是最高的31,这个也不能用
TaskHandle_t Task1_Handler; //任务句柄
//========================任务2相关========================
void Task2(void *pvParameters); //任务函数声明
#define TASK2_SIZE 120 //任务堆栈大小
#define TASK2_PRIO 3 //任务优先级,注意,优先级“0”不能用,这个是空闲任务的优先级,
//空闲任务在开启任务调度器中会自动创建
//还有一个软件定时器任务,这个任务优先级是最高的31,这个也不能用
TaskHandle_t Task2_Handler; //任务句柄
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
//创建任务:
//(这个任务里面再去创建其它任务)
xTaskCreate((TaskFunction_t) Start_Task, //任务函数名
(const char *) "Start_Task", //任务名称(随便取)
(uint16_t) START_TASK_SIZE, //任务堆栈大小
(void *) NULL, //任务参数,一般为空
(UBaseType_t) START_TASK_PRIO, //任务优先级
(TaskHandle_t *) &Start_Task_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度器
}
//**************************************************************
// 具体任务函数
//函数名:Start_Task
//**************************************************************
void Start_Task(void *pvParameters)
{
//创建任务1:
xTaskCreate((TaskFunction_t) Task1, //任务函数名
(const char *) "Task1", //任务名称(随便取)
(uint16_t) TASK1_SIZE, //任务堆栈大小
(void *) NULL, //任务参数,一般为空
(UBaseType_t) TASK1_PRIO, //任务优先级
(TaskHandle_t *) &Task1_Handler); //任务句柄
//创建任务2:
xTaskCreate((TaskFunction_t) Task2, //任务函数名
(const char *) "Task2", //任务名称(随便取)
(uint16_t) TASK2_SIZE, //任务堆栈大小
(void *) NULL, //任务参数,一般为空
(UBaseType_t) TASK2_PRIO, //任务优先级
(TaskHandle_t *) &Task2_Handler); //任务句柄
vTaskDelete(Start_Task_Handler); //创建其它任务后,删除自己,参数为待删除任务的任务句柄
//vTaskDelete(NULL); //如果任务在任务函数中删除自己,也可以将参数写为"NULL",就像这个里面一样。
}
//**************************************************************
// 具体任务函数
//函数名:Task1
//**************************************************************
void Task1(void *pvParameters)
{
while(1)
{
LED0=~LED0;
vTaskDelay(200);
}
}
//**************************************************************
// 具体任务函数
//函数名:Task2
//**************************************************************
void Task2(void *pvParameters)
{
while(1)
{
LED1=~LED1;
vTaskDelay(200);
}
}