天天看點

FreeRTOS 建立第一個任務建立第一個任務

建立第一個任務

概述

建立任務的函數為:

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 版本

繼續閱讀