#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// Khai báo một semaphore
SemaphoreHandle_t xSemaphore;
int count = 0;
// Tác vụ 1: Tăng giá trị của biến đếm mỗi 2 giây
void Task1(void *pvParameters) {
while (1) {
// Tăng giá trị của count
count++;
// Phát tín hiệu cho tác vụ khác
xSemaphoreGive(xSemaphore);
// Đợi 2 giây
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}
// Tác vụ 2: Giảm giá trị của biến đếm mỗi 3 giây
void Task2(void *pvParameters) {
while (1) {
// Giảm giá trị của count
count--;
// Phát tín hiệu cho tác vụ khác
xSemaphoreGive(xSemaphore);
// Đợi 3 giây
vTaskDelay(3000 / portTICK_PERIOD_MS);
}
}
// Tác vụ 3: In giá trị của biến đếm ra màn hình chỉ khi có sự thay đổi
void Task3(void *pvParameters) {
while (1) {
// Chờ tín hiệu từ Task1 hoặc Task2
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE) {
Serial.print("Count: ");
Serial.println(count);
}
}
}
void setup() {
// Khởi động cổng Serial để in ra màn hình
Serial.begin(115200);
// Tạo semaphore nhị phân
xSemaphore = xSemaphoreCreateBinary();
// Tạo các tác vụ
xTaskCreate(Task1, "Task 1", 1000, NULL, 1, NULL);
xTaskCreate(Task2, "Task 2", 1000, NULL, 1, NULL);
xTaskCreate(Task3, "Task 3", 1000, NULL, 1, NULL);
}
void loop() {
// Không cần sử dụng gì trong loop vì tác vụ đã chạy song song
}