#include <Arduino_FreeRTOS.h>
#include "semphr.h"
// Định nghĩa chân LED
#define LED 10
// Khai báo semaphore nhị phân
SemaphoreHandle_t xBinarySemaphore;
void setup() {
// Khởi tạo Serial Monitor
Serial.begin(9600);
// Cấu hình chân LED là OUTPUT
pinMode(LED, OUTPUT);
// Tạo semaphore nhị phân
xBinarySemaphore = xSemaphoreCreateBinary();
if (xBinarySemaphore == NULL) {
Serial.println("Không thể tạo semaphore");
while (1); // Dừng chương trình nếu không thể tạo semaphore
}
// Tạo các task
xTaskCreate(LedOnTask, "LedON", 100, NULL, 1, NULL);
xTaskCreate(LedoffTask, "LedOFF", 100, NULL, 1, NULL);
// Nhả semaphore để task đầu tiên có thể chạy
xSemaphoreGive(xBinarySemaphore);
}
void loop() {
// Không cần làm gì trong hàm loop
}
// Task bật LED
void LedOnTask(void *pvParameters) {
while (1) {
// Chờ semaphore
if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
Serial.println("Inside LedOnTask");
digitalWrite(LED, LOW); // Bật LED
vTaskDelay(1000 / portTICK_PERIOD_MS); // Chờ 1 giây
// Nhả semaphore
xSemaphoreGive(xBinarySemaphore);
vTaskDelay(1); // Chờ 1 tick trước khi lặp lại
}
}
}
// Task tắt LED
void LedoffTask(void *pvParameters) {
while (1) {
// Chờ semaphore
if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
Serial.println("Inside LedoffTask");
digitalWrite(LED, HIGH); // Tắt LED
vTaskDelay(1000 / portTICK_PERIOD_MS); // Chờ 1 giây
// Nhả semaphore
xSemaphoreGive(xBinarySemaphore);
vTaskDelay(1); // Chờ 1 tick trước khi lặp lại
}
}
}