/* https://wokwi.com/projects/413408625385040897
Bài 6.1: Kết nối tác vụ
Đề bài: Viết chương trình phần mềm trên Arduino IDE cho Arduino UNO R3 sử dụng FreeRTOS để thực hiện hai tác vụ độc lập thực hiện như sau:
- Khởi tạo Task1 và Task2 cùng với một hàng đợi (Queue) chứa 3 phần tử kiểu chuỗi ký tự.
- Task1: Gửi lần lượt ba chuỗi dữ liệu đại diện cho cảm biến vào đầu hàng đợi (Queue).
- Task2: Đọc từng chuỗi từ hàng đợi và in ra màn hình Terminal thông tin sau: giá trị chuỗi, số phần tử còn lại trong hàng đợi, và không gian trống của hàng đợi
*/
#include <Arduino_FreeRTOS.h>
#include <queue.h>
// Tạo Queue cho 3 phần tử chuỗi với kích thước tối đa 20 ký tự
QueueHandle_t queue;
// Hàm Task1 gửi dữ liệu vào Queue
void Task1(void *pvParameters) {
const char *messages[3] = {"Sensor1: 23C", "Sensor2: 45%", "Sensor3: 101kPa"};
for (int i = 0; i < 3; i++) {
// Gửi chuỗi vào hàng đợi
if (xQueueSend(queue, &messages[i], portMAX_DELAY) == pdPASS) {
Serial.print("Task1: Đã gửi - ");
Serial.println(messages[i]);
}
vTaskDelay(1000 / portTICK_PERIOD_MS); // Tạm dừng 1 giây giữa các lần gửi
}
// Xóa Task1 khi đã gửi xong dữ liệu
Serial.println("Task1: Đã hoàn thành và xóa.");
vTaskDelete(NULL);
}
// Hàm Task2 nhận và đọc dữ liệu từ Queue
void Task2(void *pvParameters) {
char *message;
while (1) {
if (xQueueReceive(queue, &message, portMAX_DELAY) == pdPASS) {
// In ra màn hình giá trị phần tử và trạng thái hàng đợi
Serial.print("Task2: Đã nhận - ");
Serial.println(message);
Serial.print("Task2: Số phần tử còn lại trong hàng đợi: ");
Serial.println(uxQueueMessagesWaiting(queue));
Serial.print("Task2: Không gian trống trong hàng đợi: ");
Serial.println(uxQueueSpacesAvailable(queue));
Serial.println();
}
vTaskDelay(1500 / portTICK_PERIOD_MS); // Tạm dừng 1.5 giây giữa các lần nhận
}
}
void setup() {
Serial.begin(9600);
// Khởi tạo Queue với 3 phần tử, mỗi phần tử có thể chứa tối đa 20 ký tự
queue = xQueueCreate(3, sizeof(char *));
if (queue == NULL) {
Serial.println("Không thể tạo hàng đợi");
while (1);
}
// Tạo Task1 và Task2 với stack 250 từ, mức ưu tiên (tskIDLE_PRIORITY + 1)
xTaskCreate(Task1, "Task1", 250, NULL, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(Task2, "Task2", 250, NULL, tskIDLE_PRIORITY + 1, NULL);
}
void loop() {
// Không dùng loop() với FreeRTOS
}