STM32CubeMX學習筆記——FreeRTOS延時

簡介

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纔會有兩個入口參數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章