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);
}
}