Skip to main content

STM32 RTOS 系列教學 - 第四篇:RTOS 計時器與非阻塞處理技巧

STM32 RTOS 系列教學 - 第四篇:RTOS 計時器與非阻塞處理技巧

🎯 教學目標

  • 理解 RTOS 中軟體計時器 (Software Timer) 的用途與應用場景
  • 實作非阻塞式任務執行邏輯
  • 比較使用 osDelay 與計時器的異同

⏰ RTOS Software Timer 簡介

RTOS 中的軟體計時器是一種非阻塞機制,讓你可以在不延遲任務執行的情況下,定時觸發事件。

📌 特色

  • 背景執行,不佔用任務時間
  • 適合用於輪詢檢查、定時觸發、Timeout 等功能
  • 可重複或單次觸發

🛠 STM32CubeMX 設定 Timer

Step 1:新增 Timer

  • 開啟 Middleware > FreeRTOS > Timers
  • 新增一個 Timer:
    • 名稱:myTimer01
    • Period:1000(單位為 ms)
    • Callback Function:TimerCallback01
    • Auto-Reload:啟用

Step 2:啟用計時器

  • StartDefaultTask 或初始化任務中呼叫:
osTimerStart(myTimer01Handle, 0);

Step 3:撰寫回呼函式

void TimerCallback01(void *argument)
{
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}

🧠 非阻塞式執行技巧

傳統的 osDelay() 會讓任務進入 Blocked 狀態,若任務需同時處理多事件,建議改用計時器或時間差比較。

方法一:以 millis 判斷是否超時(需 HAL_GetTick)

uint32_t last_tick = 0;
for(;;)
{
  if(HAL_GetTick() - last_tick >= 1000)
  {
    last_tick = HAL_GetTick();
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  }
  // 其他可即時處理的邏輯
  osDelay(1); // 輕微延遲防止佔滿 CPU
}

方法二:使用 FreeRTOS 計時器(建議)

使用 timer callback 執行週期性任務,不阻塞主任務邏輯。


✅ 成功條件檢查

  • Timer 可準時觸發 LED 閃爍(GPIO 輸出)
  • 任務在不使用 osDelay 下能維持反應速度與功能
  • 系統穩定,無多餘延遲或卡死現象

🧩 下一篇預告

第 5 篇:RTOS Memory Pool 與動態資源管理