***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);
}
}
代碼中還有其它詳細註釋,注意看。