☛ 功能說明
利用 Arduino UNO 開發板、 FreeRTOS 函式庫及 semphr 函式庫,使用互斥旗標的機制控制兩個 Task ( Task1、Task2 ) ,並透過監控視窗來觀察 Task1、Task2 的運作狀況 ( 如下圖所示 )。
☛ 使用材料
Arduino UNO R3 開發板 × 1。
☛ 電路圖及麵包板接線圖
略
☛ 程式碼
#include <Arduino_FreeRTOS.h> //引用 FreeRTOS 函式庫 #include <semphr.h> //引用 semphr.h 互斥旗標函式庫 SemaphoreHandle_t mutex_v; //宣告一個 SemaphoreHandle_t 類型的變數來存儲互斥旗標的值 void setup() { Serial.begin(9600); //設定傳輸埠速率為 9600bps mutex_v = xSemaphoreCreateMutex(); //創建一個互斥旗標 mutex_v if (mutex_v == NULL) { Serial.println("Mutex can not be created"); } xTaskCreate(Task1, "Task 1", 128, NULL, 1, NULL); //建立Task1任務 xTaskCreate(Task2, "Task 2", 128, NULL, 1, NULL); //建立Task2任務 } void loop() { } void Task1(void *pvParameters) //Task1 任務 { while(1) { xSemaphoreTake(mutex_v, portMAX_DELAY); //獲取互斥旗標 Mutex_v Serial.println("Hi from Task1"); xSemaphoreGive(mutex_v); //返回互斥旗標 Mutex_v vTaskDelay(pdMS_TO_TICKS(1000)); //延遲 1 秒 } } void Task2(void *pvParameters) //Task2 任務 { while(1) { xSemaphoreTake(mutex_v, portMAX_DELAY); //獲取互斥旗標 Mutex_v Serial.println("Hi from Task2"); xSemaphoreGive(mutex_v); //返回互斥旗標 Mutex_v vTaskDelay(pdMS_TO_TICKS(500)); //延遲 0.5 秒 } }