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 與動態資源管理