☛ 功能說明

利用 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 秒
     }
}