#include <Arduino_FreeRTOS.h>
#include <semphr.h>
// Khai báo handle cho các task và semaphore
TaskHandle_t Task1Handle = NULL;
TaskHandle_t Task2Handle = NULL;
SemaphoreHandle_t xSerialSemaphore;
// Task1: In ra Serial "Task1 is running", delay 10ms
void Task1(void *pvParameters) {
(void) pvParameters;
while (1) {
if (xSemaphoreTake(xSerialSemaphore, (TickType_t)10) == pdTRUE) {
Serial.println("Task1 is running");
xSemaphoreGive(xSerialSemaphore);
vTaskDelay(10 / portTICK_PERIOD_MS); // Chờ 10ms
}
}
}
// Task2: In ra Serial "Task2 is running", delay 10ms, sau khi in đủ 10 lần thì chuyển Priority của Task1 thành 2
void Task2(void *pvParameters) {
(void) pvParameters;
int count = 0;
while (1) {
if (xSemaphoreTake(xSerialSemaphore, (TickType_t)10) == pdTRUE) {
Serial.println("Task2 is running");
xSemaphoreGive(xSerialSemaphore);
vTaskDelay(10 / portTICK_PERIOD_MS); // Chờ 10ms
count++;
if (count >= 10) {
// Chuyển Priority của Task1 thành 2
vTaskPrioritySet(Task1Handle, 2);
// Kết thúc Task2
vTaskDelete(NULL);
}
}
}
}
void setup() {
// Khởi tạo Serial
Serial.begin(9600);
// Khởi tạo semaphore
xSerialSemaphore = xSemaphoreCreateMutex();
if (xSerialSemaphore != NULL) {
// Khởi tạo các task
xTaskCreate(Task1, "Task1", 128, NULL, 1, &Task1Handle);
xTaskCreate(Task2, "Task2", 128, NULL, 1, &Task2Handle);
}
}
void loop() {
// Không làm gì trong hàm loop() khi sử dụng FreeRTOS
}