#include <Arduino_FreeRTOS.h>
#include <semphr.h>
SemaphoreHandle_t interruptSemaphore;
void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
// Tạo 2 task
xTaskCreate(TaskLedon, // Task function
"Ledon", // Task name
128, // Stack size
NULL,
0 ,// Priority
NULL );
xTaskCreate(TaskLedoff, // Task function
"Ledoff", // Task name
128, // Stack size
NULL,
0, // Priority
NULL );
interruptSemaphore = xSemaphoreCreateBinary();
if (interruptSemaphore != NULL)
{
// Thiết lập interrupt vào chân 2 khi nhả nút nhấn
attachInterrupt(digitalPinToInterrupt(2), interruptHandler, HIGH);
}
}
void loop() {}
// Hàm phục vụ ngắt: give token khi ngắt xảy ra
void interruptHandler()
{
Serial.println("Semaphore is given");
BaseType_t xHigherPriorityTaskWoken pdFALSE;
xSemaphoreGiveFromISR(interruptSemaphore, &xHigherPriorityTaskWoken);
}
// Thực hiện take token, bật đèn khi thành công
void TaskLedon(void *pvParameters)
{
(void) pvParameters;
for (;;)
{
if (xSemaphoreTake(interruptSemaphore, portMAX_DELAY) == pdPASS)
{
Serial.println("TaskLedon Received Semaphore");
digitalWrite(LED_BUILTIN, HIGH);
}
}
}
// Thực hiện take token, tắt đèn khi take thành công
void TaskLedoff(void *pvParameters)
{
(void) pvParameters;
for (;;)
{
if (xSemaphoreTake(interruptSemaphore, portMAX_DELAY) == pdPASS)
{
Serial.println("TaskLedoff Received Semaphore");
digitalWrite(LED_BUILTIN, LOW);
}
}
}