☛ 功能说明

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