# 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()` 函式：
```c
void StartDefaultTask(void *argument)
{
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 第一顆 LED
    osDelay(500);
  }
}
```

### 實作第二個任務 `StartBlinkTask2()`：
```c
void StartBlinkTask2(void *argument)
{
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 第二顆 LED
    osDelay(200);
  }
}
```

---

## ✅ 成功條件檢查
- 程式編譯成功
- 上電後兩顆 LED 分別以不同頻率閃爍
- 無卡死或異常閃爍

---

## 🧩 下一篇預告
**第 3 篇：RTOS 任務間通訊（Queue 與 Semaphore 實作）**