故事的開始來自於以上影片
紅色LED GPIO 27 亮1秒停2秒;
黃色LED GPIO 26 亮1秒停3秒;
綠色LED GPIO 25 亮1秒停4秒;
以FreeRtos方式來寫
記得先安裝FreeRtos Library
// 包含必要的 Arduino 和 FreeRTOS 函式庫
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// 定義 LED 的 GPIO 引腳
#define RED_LED_PIN 27 // 紅色 LED
#define YELLOW_LED_PIN 26 // 黃色 LED
#define GREEN_LED_PIN 25 // 綠色 LED
// 任務函數原型宣告
void redLedTask(void *parameter); // 紅色 LED 任務
void yellowLedTask(void *parameter); // 黃色 LED 任務
void greenLedTask(void *parameter); // 綠色 LED 任務
void setup() {
// 初始化序列埠,設定鮑率為 115200
Serial.begin(115200);
// 設定 LED 引腳為輸出模式
pinMode(RED_LED_PIN, OUTPUT);
pinMode(YELLOW_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
// 創建 FreeRTOS 任務
// 紅色 LED 任務
xTaskCreate(
redLedTask, // 任務函數
"Red LED", // 任務名稱
2048, // 堆棧大小 (bytes)
NULL, // 參數
1, // 優先級
NULL // 任務句柄
);
// 黃色 LED 任務
xTaskCreate(
yellowLedTask,
"Yellow LED",
2048,
NULL,
1,
NULL
);
// 綠色 LED 任務
xTaskCreate(
greenLedTask,
"Green LED",
2048,
NULL,
1,
NULL
);
}
// 主循環保持空閒
void loop() {
// 刪除主任務以讓 FreeRTOS 完全接管
vTaskDelete(NULL);
}
// 紅色 LED 任務
void redLedTask(void *parameter) {
while(1) { // 無限迴圈
// 打開紅色 LED
digitalWrite(RED_LED_PIN, HIGH);
Serial.println("紅燈亮");
// 等待 1 秒
vTaskDelay(1000 / portTICK_PERIOD_MS);
// 關閉紅色 LED
digitalWrite(RED_LED_PIN, LOW);
Serial.println("紅燈滅");
// 等待 2 秒
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
// 黃色 LED 任務
void yellowLedTask(void *parameter) {
while(1) { // 無限迴圈
// 打開黃色 LED
digitalWrite(YELLOW_LED_PIN, HIGH);
Serial.println("黃燈亮");
// 等待 1 秒
vTaskDelay(1000 / portTICK_PERIOD_MS);
// 關閉黃色 LED
digitalWrite(YELLOW_LED_PIN, LOW);
Serial.println("黃燈滅");
// 等待 3 秒
vTaskDelay(3000 / portTICK_PERIOD_MS);
}
}
// 綠色 LED 任務
void greenLedTask(void *parameter) {
while(1) { // 無限迴圈
// 打開綠色 LED
digitalWrite(GREEN_LED_PIN, HIGH);
Serial.println("綠燈亮");
// 等待 1 秒
vTaskDelay(1000 / portTICK_PERIOD_MS);
// 關閉綠色 LED
digitalWrite(GREEN_LED_PIN, LOW);
Serial.println("綠燈滅");
// 等待 4 秒
vTaskDelay(4000 / portTICK_PERIOD_MS);
}
}