建立第一個任務
概述
建立任務的函數為:
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
configSTACK_DEPTH_TYPE usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask
);
除 FreeRTOS 标準的上述函數外,ESP-IDF 提供另增的 函數:
BaseType_t xTaskCreatePinnedToCore(TaskFunction_t pvTaskCode,
const char *const pcName,
const uint32_t usStackDepth,
void *const pvParameters,
BaseType_t uxPriority,
TaskHandle_t *const pvCreatedTask,
const BaseType_t xCoreID)
是的,後者相比前者多了一個傳參
xCoreID
,因為一些 ESP32 是雙核 CPU,這個參數用于訓示建立的 task 運作在哪個 CPU 核心上。
需求及功能解析
任務建立的幾個參數分别是:
pvTaskCode–任務要執行的代碼。通常是個循環代碼塊。注意,TaskCode 是下述概念的核心。
pcName–任務的描述性名稱。這主要是為了便于調試。
usStackDepth–任務堆棧的大小,指定為位元組數,上述 TaskCode 中的局部變量将從該空間配置設定空間。請注意,這與标準的 FreeRTOS 不同,标準的 FreeRTOS 中這裡以字(一個字可能是4個位元組)為機關。
pvParameters– 指向傳遞給 TaskCode 中的參數。
uxPriority–任務運作的優先級。值越大,優先級越高,越容易擷取 CPU 的使用權而得到執行。
pvCreatedTask–任務句柄,用于辨別該任務,後續可以通過該句柄管理、删除任務、擷取任務的資訊等。
xCoreID–指定該任務運作的CPU 核心。如果你使用的不是雙核的裝置,請不要使用 xTaskCreatePinnedToCore(),必須使用的情況下,即便指定為 CPU1,也會預設在 CPU0 上建立任務。
示例解析
示例輸出:
I (10) TASK1: task1_flag = 0, arg1 = 1
I (336) TASK2: task2_flag = 0, arg2 = 2
I (346) TASK3: task3_flag = 0, arg3 = 3
任務建立後,将自動運作,每隔一段時間(通過
vTaskDelay(pdMS_TO_TICKS(1000));
實作延時)列印任務的 flag 和 傳遞到任務中的參數。
請注意,ESP-IDF 提供了一些進階的列印函數,如 ESP_LOGI()、ESP_LOGW(),它們是 printf() 的變體,像使用 printf() 一樣去使用它們就可以了,後續不再說明。
讨論
任務建立函數中的幾個參數對任務運作的影響,建議随時使用上篇部落格中介紹的相關資源,通過網絡查詢使用到的相關 API。
總結
1)ESP32 啟動後将自動啟用 FreeRTOS,并運作 void app_main(void) 中的代碼
2)建立任務使用 xTaskCreate()、xTaskCreatePinnedToCore(),任務被建立後将自動被 FreeRTOS 管理,自動加載運作任務中的 TaskCode.
3)任務中的延時使用 vTaskDelay(),延時 1000ms 的示例為 vTaskDelay(pdMS_TO_TICKS(1000));
資源連結
1)Learning-FreeRTOS-with-esp32 系列部落格介紹
2)對應示例的 code 連結 (點選直達代碼倉庫)
3) 下一篇: FreeRTOS 建立任務的 Static 版本