簡介
rtos中使用延遲的方法是調用rtos提供的兩個函數,分別是
vTaskDelay()
vTaskDelayUntil()
之所以要使用rtos提供的方式,而不是自己手寫循環進行延時,是因爲一個系統中不光有一個任務,如果使用循環進行延遲,那麼必將影響到其他的任務運行,系統也需要進行任務切換。
說明
vTaskDelay
相對延遲函數
示例代碼:
/* USER CODE END Header_blink02 */
void blink02(void const * argument)
{
/* USER CODE BEGIN blink02 */
/* Infinite loop */
while(1)
{
dosomething(); //相關的執行函數
vTaskDelay(100); //延時100毫秒
}
/* USER CODE END blink02 */
}
在整個循環中有用戶執行的代碼(dosomething();) 還有延時函數(vTaskDelay(100);)
那麼一次循環的運行時間 = 用戶執行的代碼的時間 + 100ms
vTaskDelayUntil
絕對延時函數
示例代碼:
/* USER CODE END Header_blink02 */
void blink02(void const * argument)
{
/* USER CODE BEGIN blink02 */
TickType_t PreviousWakeTime; //用於vTaskDelayUntil初始化的變量
const TickType_t TimeIncrement = pdMS_TO_TICKS(100); //將要延時的時間轉化成系統tick
PreviousWakeTime = xTaskGetTickCount(); //獲取當前系統tick
/* Infinite loop */
while(1)
{
dosomething(); //相關的執行函數
vTaskDelayUntil(&PreviousWakeTime ,TimeIncrement); //延時100毫秒
}
/* USER CODE END blink02 */
}
總運行時間就是100ms ,無論用戶執行的代碼(dosomething();)如何變動,一次循環的運行時間都是100ms
他的原理是先知道剛進入循環(或循環最後)的時間點,然後用現在的時間點減去那個時間點,那麼得到的就是用戶執行的代碼(dosomething();)所消耗的時間,再用需要延遲的時間減去它,就得到了自己應該延時的時間,所以vTaskDelayUntil纔會有兩個入口參數