FreeRTOS的任務刪除

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章