/*
Bài III.1. Viết chương trình phần mềm trên Arduino IDE cho Arduino UNO R3 sử dụng Free RTOS hai tác vụ độc lập thực hiện như sau:
- Khởi tạo Task1 chạy in ra màn hình Terminal dòng chữ "Task1 is running" và Task2 chạy in ra màn hình Terminal dòng chữ "Task2 is running";
- Chạy 2 Task trên 4 lần với chu kỳ 1nhịp/1s, sau đó xóa Task1 và chỉ chạy Task2 in ra màn hình Terminal dòng chữ "Task2 is running".
*/
#include <Arduino_FreeRTOS.h> // Thư viện FreeRTOS để quản lý đa nhiệm
TaskHandle_t xTaskHandle1; // Khai báo biến giữ địa chỉ của Task1
TaskHandle_t xTaskHandle2; // Khai báo biến giữ địa chỉ của Task2
volatile int num = 0; // Biến toàn cục num để kiểm tra trong Task1, sử dụng "volatile" vì giá trị có thể thay đổi ngoài luồng chính
BaseType_t xReturn; // Biến để lưu trữ kết quả trả về từ các hàm FreeRTOS (không sử dụng trong ví dụ này)
void setup()
{
Serial.begin(9600); // Khởi tạo giao tiếp Serial với tốc độ baud 9600
xTaskCreate(Task1, "Task1", 64, NULL, 2, &xTaskHandle1); // Tạo Task1 với kích thước stack 64 byte, ưu tiên 2, lưu handle vào xTaskHandle1
xTaskCreate(Task2, "Task2", 64, NULL, 1, &xTaskHandle2); // Tạo Task2 với kích thước stack 64 byte, ưu tiên 1, lưu handle vào xTaskHandle2
delay(10); // Trì hoãn 10ms để đảm bảo các task được tạo xong trước khi khởi động bộ điều phối (scheduler)
vTaskStartScheduler(); // Bắt đầu bộ điều phối FreeRTOS để chạy các task
}
void loop()
{
// Hàm loop() không được sử dụng vì FreeRTOS quản lý các task
}
void Task1(void *pvParameters) // Định nghĩa Task1
{
while(1) { // Vòng lặp vô hạn, task sẽ chạy liên tục
num++; // Tăng giá trị num lên 1 mỗi lần chạy
Serial.println("Task1 is running"); // In ra thông báo "Task1 is running" mỗi giây
delay(1000); // Tạm dừng task1 1 giây
if (num == 4) { // Nếu num bằng 4
vTaskDelete(xTaskHandle1); // Xóa Task1 khỏi bộ điều phối (dừng Task1)
}
}
vTaskDelete(NULL); // Xóa task hiện tại (không bao giờ chạy đến đây do có vòng lặp vô hạn)
}
void Task2(void *pvParameters) // Định nghĩa Task2
{
vTaskPrioritySet(NULL, 2); // Thiết lập độ ưu tiên của Task2 thành 2
while(1) { // Vòng lặp vô hạn để Task2 chạy liên tục
Serial.println("Task2 is running"); // In ra thông báo "Task2 is running" mỗi giây
delay(1000); // Tạm dừng task2 1 giây
}
vTaskDelete(NULL); // Xóa task hiện tại (không bao giờ chạy đến đây do có vòng lặp vô hạn)
}