// Include header files of FreeRTOS and event groups
#include <Arduino_FreeRTOS.h>
#include "event_groups.h"
// Define event flag bit variables
#define TASK1_BIT (1UL << 0UL) // Bit 0
#define TASK2_BIT (1UL << 1UL) // Bit 1
#define TASK3_BIT (1UL << 2UL) // Bit 2
// Declare an event group handler
EventGroupHandle_t xEventGroup;
// Define a 500ms delay for periodic execution
const TickType_t xDelay = pdMS_TO_TICKS(1000);
void setup() {
Serial.begin(9600);
// Create event group
xEventGroup = xEventGroupCreate();
if (xEventGroup == NULL) {
Serial.println("Failed to create event group!");
while(1); // Dừng nếu không tạo được event group
}
// Create three input tasks that set event flags
xTaskCreate(InputTask1, "Input Task 1", 128, NULL, 1, NULL);
xTaskCreate(InputTask2, "Input Task 2", 128, NULL, 1, NULL);
xTaskCreate(InputTask3, "Input Task 3", 128, NULL, 1, NULL);
// Create an output task that executes when all events occur
xTaskCreate(OutputTask, "Output Task", 128, NULL, 1, NULL);
}
// Definition of Input Task 1
void InputTask1(void *pvParameters) {
while(1) {
xEventGroupSetBits(xEventGroup, TASK1_BIT);
vTaskDelay(xDelay);
}
}
// Definition of Input Task 2
void InputTask2(void *pvParameters) {
while(1) {
xEventGroupSetBits(xEventGroup, TASK2_BIT);
vTaskDelay(xDelay);
}
}
// Definition of Input Task 3
void InputTask3(void *pvParameters) {
while(1) {
xEventGroupSetBits(xEventGroup, TASK3_BIT); // Sửa lỗi TASK2_BIT thành TASK3_BIT
vTaskDelay(xDelay);
}
}
// Definition of Output Task
void OutputTask(void *pvParameters) {
// Define a variable to hold event state
const EventBits_t xBitsToWaitFor = (TASK1_BIT | TASK2_BIT | TASK3_BIT);
EventBits_t xEventGroupValue;
while(1) {
// Wait until all three tasks set their event bits
xEventGroupValue = xEventGroupWaitBits(
xEventGroup, // Event group handle
xBitsToWaitFor, // Bits to wait for
pdTRUE, // Clear bits after reading
pdTRUE, // Wait for all bits
portMAX_DELAY // Block indefinitely
);
if ((xEventGroupValue & TASK1_BIT) != 0) {
Serial.println("Task1 event occurred");
}
if ((xEventGroupValue & TASK2_BIT) != 0) { // Sửa lỗi ngoặc
Serial.println("Task2 event occurred");
}
if ((xEventGroupValue & TASK3_BIT) != 0) {
Serial.println("Task3 event occurred");
}
}
}
void loop() {}