文章目錄
- 前言
- 一、vTaskDelay與vTaskDelayUntil
- 二、示例代碼
- 總結
前言
本系列基于stm32
系列單片機來使用freerots
任務管理是實時操作系統(RTOS)的核心功能之一,它允許開發者以并發的方式組織和管理多個任務。FreeRTOS 是一個流行的開源RTOS,它提供了強大的任務管理功能,讓開發者能夠輕松創建和控制任務。本文將介紹 FreeRTOS 的任務管理功能,包括任務的創建、刪除、掛起、恢復和優先級控制等方面的內容。
一、vTaskDelay與vTaskDelayUntil
當我們在編寫多任務程序時,經常需要控制任務之間的時間間隔,讓它們按照一定的時間順序執行。這時就可以使用 FreeRTOS 提供的兩個函數:vTaskDelay 和 vTaskDelayUntil。
vTaskDelay
:這個函數用于讓當前任務延遲一段時間后再繼續執行。你可以把它看作是一個暫停命令,告訴任務要等待一段時間后再繼續往下執行。函數原型如下:
void vTaskDelay( const TickType_t xTicksToDelay );
其中,xTicksToDelay 是一個時間參數,表示需要延遲的時鐘節拍數。時鐘節拍數的大小取決于系統的配置,一般情況下,1 個時鐘節拍對應一定的時間單位,例如毫秒。調用這個函數后,當前任務會暫停執行指定的時間,然后再繼續往下執行。使用pdMS_TO_TICKS()
把ms變成節拍數,在前面我們也了解了一點.
vTaskDelayUntil
:這個函數用于讓當前任務在指定的時間點后再繼續執行。你可以把它看作是一個定時器,告訴任務要在特定的時間點再次運行。函數原型如下:
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );
其中,pxPreviousWakeTime 是一個指向時間變量的指針,表示任務上次喚醒的時間。xTimeIncrement 是一個時間增量,表示任務需要等待的時間長度。調用這個函數后,當前任務會根據上次喚醒時間和時間增量計算出下次喚醒的時間,然后暫停執行,直到達到指定的時間后再繼續執行。
區別:
vTaskDelay 是相對延遲,即任務會在當前時間的基礎上延遲一段時間。
vTaskDelayUntil 是絕對延遲,即任務會在上次喚醒時間的基礎上延遲一段時間。
二、示例代碼
void vTask1(void* pvParameters)
{TickType_t xLastWakeTime;const TickType_t xDelay = pdMS_TO_TICKS(1000); // 設置延遲時間為 1000ms// 初始化上次喚醒時間xLastWakeTime = xTaskGetTickCount(); while (1){// 任務執行代碼vTaskDelayUntil(&xLastWakeTime, xDelay);}
}void vTask2(void* pvParameters)
{while (1){// 任務執行代碼vTaskDelay(pdMS_TO_TICKS(500)); // 延遲 500ms}
}
在上面的示例中,vTask1 和 vTask2 是兩個并發運行的任務。vTask1 使用 vTaskDelayUntil 函數將任務定時在每隔 1000ms 運行一次。vTask2 使用 vTaskDelay 函數延遲 500ms 后再繼續執行。通過這兩個函數,我們可以靈活地控制任務之間的時間間隔,實現多任務并發執行。
注意:vTaskDelayUntil(&xLastWakeTime, xDelay);
他延時完后,會自動更新xLastWakeTime,所以我們只需要在while
循環初始化一下xLastWakeTime
就行了。
總結
任務管理是 FreeRTOS 提供的一個強大功能,它允許開發者以并發的方式組織和管理多個任務。通過任務的創建、刪除、掛起、恢復和優先級控制等操作,開發者可以靈活地控制任務的執行順序和調度策略,從而實現復雜的系統功能。任務通信與同步機制進一步增強了任務的協同工作能力,使任務之間能夠高效地共享數據和協調操作。借助 FreeRTOS 提供的任務管理功能,開發者可以更加方便地構建實時嵌入式系統,并具備可靠性和高效性。
需要注意的是,在使用 FreeRTOS 進行任務管理時,開發者需要注意任務的資源管理、優先級設置和調度策略等方面,以確保系統能夠穩定地運行,并滿足實時性和響應性的要求。