#include <Arduino_FreeRTOS.h>
#include <semphr.h>
const int ledPin = 13;
const int buttonPin = 2; // Sử dụng chân 2 cho ngắt ngoài
SemaphoreHandle_t binarySemaphore;
void TaskControlLED(void *pvParameters) {
(void) pvParameters;
for (;;) {
// Chờ đến khi semaphore được give
if (xSemaphoreTake(binarySemaphore, portMAX_DELAY) == pdTRUE) {
Serial.println("Inside TaskControlLED");
digitalWrite(ledPin, HIGH); // Bật LED
vTaskDelay(1000 / portTICK_PERIOD_MS); // Giữ LED sáng trong 1 giây
digitalWrite(ledPin, LOW); // Tắt LED
}
}
}
// Hàm xử lý ngắt, give semaphore
void ISR_ButtonPress() {
Serial.println("Vao ngắt");
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(binarySemaphore, &xHigherPriorityTaskWoken);
if (xHigherPriorityTaskWoken) {
taskYIELD();
}
}
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Sử dụng điện trở kéo lên nội bộ
Serial.begin(9600);
// Tạo binary semaphore
binarySemaphore = xSemaphoreCreateBinary();
// Tạo task điều khiển LED
xTaskCreate(TaskControlLED, "Control LED", 128, NULL, 1, NULL);
// Gắn ngắt vào chân buttonPin
attachInterrupt(digitalPinToInterrupt(buttonPin), ISR_ButtonPress, CHANGE);
}
void loop() {
// Do nothing here
}