FreeRTOS的動態任務創建

***FreeRTOS分爲“動態任務創建”和“靜態任務創建”***兩種任務創建方式。
任務創建時,會分配兩塊內存,一塊用來存任務控制塊,一塊用來存任務堆棧。使用動態創建時系統會自動分配這些內存,使用靜態創建時需要自己創建這兩塊內存。
任務的創建常用動態方法創建。

動態任務創建函數:xTaskCreate();

BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,
							const char * const pcName,
							const uint16_t usStackDepth,
							void * const pvParameters,
							UBaseType_t uxPriority,
							TaskHandle_t * const pxCreatedTask )

FreeRTOS動態任務創建:
任務創建步驟:

//1、大體構思任務框架;
//2、準備好任務創建函數:"xTaskCreate();"
//3、將任務創建函數"xTaskCreate()"裏面的參數都準備好填進去,
//   任務參數就是:任務函數的函數名、任務名、堆棧、優先級、句柄;
//4、編寫任務的具體函數,函數體內搞個大循環,剩下的就是具體的功能了;
//5、一切準備好後,開啓任務調度器.

例如:
準備好任務創建函數:

BaseType_t xTaskCreate(	TaskFunction_t pxTaskCode,
							const char * const pcName,
							const uint16_t usStackDepth,
							void * const pvParameters,
							UBaseType_t uxPriority,
							TaskHandle_t * const pxCreatedTask )

爲函數準備好所需參數:

//========================任務1相關========================
void Task1(void *pvParameters);     //任務函數聲明
#define TASK1_SIZE     120          //任務堆棧大小
#define TASK1_PRIO     2            //任務優先級,注意,優先級“0”不能用,這個是空閒任務的優先級,
                                    //空閒任務在開啓任務調度器中會自動創建
                                    //還有一個軟件定時器任務,這個任務優先級是最高的31,這個也不能用
TaskHandle_t Task1_Handler;         //任務句柄

將任務參數代入後:

//創建任務1:
    xTaskCreate((TaskFunction_t)    Task1,             //任務函數名
				(const char *)      "Task1",           //任務名稱(隨便取)
				(uint16_t)          TASK1_SIZE,        //任務堆棧大小
				(void *)            NULL,              //任務參數,一般爲空
				(UBaseType_t)       TASK1_PRIO,        //任務優先級
				(TaskHandle_t *)    &Task1_Handler);   //任務句柄

任務1的具體功能實現:

//**************************************************************
//                      具體任務函數
//函數名:Task1
//**************************************************************
void Task1(void *pvParameters)
{
	while(1)
    {
        LED0=~LED0;
        vTaskDelay(200);
    }
}

開啓任務調度器:

vTaskStartScheduler();                                  //開啓任務調度器

整體代碼詳解:

  • 創建一個任務,任務函數名稱爲:Task1();
  • 此任務功能爲 LED0的閃爍;
    代碼如下:
#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、一切準備好後,開啓任務調度器.

//========================任務1相關========================
void Task1(void *pvParameters);     //任務函數聲明
#define TASK1_SIZE     120          //任務堆棧大小
#define TASK1_PRIO     1            //任務優先級,注意,優先級“0”不能用,這個是空閒任務的優先級,
                                    //空閒任務在開啓任務調度器中會自動創建
                                    //還有一個軟件定時器任務,這個任務優先級是最高的31,這個也不能用
TaskHandle_t Task1_Handler;         //任務句柄


int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組4	 
	delay_init();	    				//延時函數初始化	  
	uart_init(115200);					//初始化串口
	LED_Init();		  					//初始化LED
    
    //創建任務1:
    xTaskCreate((TaskFunction_t)    Task1,             //任務函數名
				(const char *)      "Task1",           //任務名稱(隨便取)
				(uint16_t)          TASK1_SIZE,        //任務堆棧大小
				(void *)            NULL,              //任務參數,一般爲空
				(UBaseType_t)       TASK1_PRIO,        //任務優先級
				(TaskHandle_t *)    &Task1_Handler);   //任務句柄
    
    vTaskStartScheduler();                                  //開啓任務調度器
}



//**************************************************************
//                      具體任務函數
//函數名:Task1
//**************************************************************
void Task1(void *pvParameters)
{
	while(1)
    {
        LED0=~LED0;
        vTaskDelay(200);
    }
}



代碼中還有其它詳細註釋,注意看。

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