#include <Arduino_FreeRTOS.h>
// Khai báo biến lưu trữ handle của từng task
TaskHandle_t TaskHandle_2;
TaskHandle_t TaskHandle_3;
TaskHandle_t TaskHandle_4;
// Chân nối nút nhấn
const int buttonPin = 2;
volatile bool isrFlag = false; // Biến cờ để thông báo từ ISR cho hàm loop
void setup() {
Serial.begin(9600);
Serial.println(F("In Setup function"));
// Khởi tạo FreeRTOS
if (xTaskCreate(MyTask2, "Task2", 100, NULL, 2, &TaskHandle_2) != pdPASS ||
xTaskCreate(MyTask3, "Task3", 100, NULL, 3, &TaskHandle_3) != pdPASS ||
xTaskCreate(MyTask4, "Task4", 100, NULL, 4, &TaskHandle_4) != pdPASS) {
Serial.println(F("Failed to create one or more tasks"));
while (1); // Dừng lại nếu không tạo được task
}
// Thiết lập chân nút nhấn với pull-up
pinMode(buttonPin, INPUT_PULLUP);
// Thiết lập ngắt INT0 (chân 2) để khôi phục các task
attachInterrupt(digitalPinToInterrupt(buttonPin), ExternalInterrupt, FALLING);
// Khởi động FreeRTOS
vTaskStartScheduler();
}
void loop() {
// In ra các thông điệp từ ISR nếu có
if (isrFlag) {
Serial.println(F("ISR event handled in loop"));
isrFlag = false; // Đặt lại cờ
}
// Hàm loop này sẽ không thực hiện công việc gì
}
// Hàm task 2
static void MyTask2(void* pvParameters) {
for (;;) {
Serial.println(F("Task2 is running"));
vTaskDelay(pdMS_TO_TICKS(1000)); // Task2 delay 1s
}
}
// Hàm task 3
static void MyTask3(void* pvParameters) {
for (;;) {
Serial.println(F("Task3 is running"));
vTaskDelay(pdMS_TO_TICKS(1000)); // Task3 delay 1s
}
}
// Hàm task 4
static void MyTask4(void* pvParameters) {
for (;;) {
Serial.println(F("Task4 is running"));
// Tạm ngừng Task2 và Task3
vTaskSuspend(TaskHandle_2);
vTaskSuspend(TaskHandle_3);
// Tạm ngừng chính task của nó (Task4)
vTaskSuspend(NULL);
Serial.println(F("Back in Task4, Deleting Itself"));
vTaskDelete(TaskHandle_4); // Xóa task của chính nó
}
}
// Hàm ngắt ngoài
static void ExternalInterrupt() {
static int count = 0;
if (count <= 3) {
count++;
}
switch (count) {
case 1:
Serial.println(F("ISR Resuming Task2"));
xTaskResumeFromISR(TaskHandle_2);
break;
case 2:
Serial.println(F("ISR Resuming Task3"));
xTaskResumeFromISR(TaskHandle_3);
break;
case 3:
Serial.println(F("ISR Resuming Task4"));
xTaskResumeFromISR(TaskHandle_4);
break;
default:
// Do nothing
break;
}
isrFlag = true; // Đặt cờ báo hiệu đã xử lý sự kiện từ ISR
}