Skip to main content

STM32 RTOS 系列教學 - 第二篇:多任務與任務切換(雙 LED 閃爍)

🎯 教學目標

  • 建立多個 RTOS Task
  • 觀察 RTOS 的任務切換運作方式
  • 實作雙 LED 閃爍功能

📚 RTOS 多任務概念

RTOS 支援多任務(Multi-tasking)機制,每個任務都是獨立的執行單元,能透過 scheduler 依據優先權與排程策略輪流執行。

RTOS 排程器會:

  • 根據任務優先順序分配 CPU 使用時間
  • 任務之間可透過延遲(osDelay())進行時間讓渡
  • 支援同步與互斥(未來章節會提)

🛠 STM32CubeMX 設定(延續第一篇專案)

Step 1:新增第二個 Task

  • 開啟你的專案(或從第一篇延續)
  • Middleware > FREERTOS > Tasks and Queues
  • 新增一個任務,例如 blinkTask2,對應函式:StartBlinkTask2
  • 建議 stack size: 128、priority: Low(低於 defaultTask)

Step 2:設定第二顆 LED 的 GPIO

  • 假設第一顆 LED 使用 PC13
  • 新增另一個 GPIO,例如 PA5,設定為 GPIO_Output

Step 3:產生程式碼

  • 點選 Project > Generate Code,進入 IDE 編輯

🧪 編寫雙 Task 閃爍程式

修改 StartDefaultTask() 函式:

void StartDefaultTask(void *argument)
{
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 第一顆 LED
    osDelay(500);
  }
}

實作第二個任務 StartBlinkTask2()

void StartBlinkTask2(void *argument)
{
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 第二顆 LED
    osDelay(200);
  }
}

✅ 成功條件檢查

  • 程式編譯成功
  • 上電後兩顆 LED 分別以不同頻率閃爍
  • 無卡死或異常閃爍

🧩 下一篇預告

第 3 篇:RTOS 任務間通訊(Queue 與 Semaphore 實作)