1. 程式人生 > >FreeRtos——多任務

FreeRtos——多任務

實現 由於 數值 那是 時間 let 周期性 .cn div

多任務和單任務幾乎沒有差別。只用多創建一個或多個任務,其他地方和單任務時相同。

static void AppTaskCreate(void)
{
    xTaskCreate(vTaskLed1,           /* 任務函數名 */
                "Task Led1",         /* 任務名,字符串形式,方便調試 */
                 512,                /* 棧大小,單位為字,即4個字節 */
                 (void *)&task_led3,  // task_led1-task_led3可以切換   /* 任務形參 */
1, /* 優先級,數值越大,優先級越高 */ &xHandleTaskLED1); /* 任務句柄 */ xTaskCreate( vTaskBeep, "Task Beep", 512, NULL,
2, &xHandleTaskBeep); }

這裏采用一個任務做LED燈閃爍,一個任務做蜂鳴器,可以看到兩個任務展現出似乎同時運行的現象。

但是,其中有一個地方需要測試

我們知道裸機中,優先級設置一樣時,會看硬件編號,小的優先級高。

freertos中,優先級數值越大的,優先級越高,那麽,要是設置成優先級相同,那是以什麽方式運行的呢?這個等到下一章,講串口調試時我們來驗證。

vTaskDelayUntil() API 函數
vTaskDelayUntil()類似於 vTaskDelay()。和範例中演示的一樣,函數 vTaskDelay()
的參數用來指定任務在調用 vTaskDelay()到切出阻塞態整個過程包含多少個心跳周期。
任務保持在阻塞態的時間量由 vTaskDelay()的入口參數指定,但任務離開阻塞態的時刻
實際上是相對於 vTaskDelay()被調用那一刻的。 vTaskDelayUntil()的參數就是用來指定
任務離開阻塞態進入就緒態那一刻的精確心跳計數值。 API 函數 vTaskDelayUntil()可以
用於實現一個固定執行周期的需求(當你需要讓你的任務以固定頻率周期性執行的時
)。由於調用此函數的任務解除阻塞的時間是絕對時刻,比起相對於調用時刻的相對
時間更精確(

即比調用 vTaskDelay()可以實現更精確的周期性)
void vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement );
程序清單 13 vTaskDelayUntil() API 函數原型

技術分享

FreeRtos——多任務