#include <Arduino.h>
#include <Arduino_FreeRTOS.h>
#include <queue.h>
// Định nghĩa queue handle
QueueHandle_t xQueue;
// Định nghĩa các thông điệp
const char *messages[] = {"message 1", "message 2", "message 3", "message 4"};
// Task1: Tạo và ghi đè vào queue
void Task1(void *pvParameters) {
// Tạo queue có thể chứa 3 phần tử, mỗi phần tử là một chuỗi ký tự tối đa 15 ký tự
xQueue = xQueueCreate(3, sizeof(char[15]));
if (xQueue != NULL) {
// Đưa hai phần tử vào queue
xQueueSend(xQueue, (void *)messages[0], portMAX_DELAY);
vTaskDelay(1000 / portTICK_PERIOD_MS); // Để đảm bảo task2 có thời gian để đọc phần tử đầu tiên
xQueueSend(xQueue, (void *)messages[1], portMAX_DELAY);
// Ghi đè hai phần tử khác vào queue
xQueueSend(xQueue, (void *)messages[2], portMAX_DELAY);
vTaskDelay(1000 / portTICK_PERIOD_MS); // Để đảm bảo task2 có thời gian để đọc phần tử thứ hai
xQueueSend(xQueue, (void *)messages[3], portMAX_DELAY);
}
// Xóa task sau khi hoàn thành
vTaskDelete(NULL);
}
// Task2: Đọc và in dữ liệu từ queue
void Task2(void *pvParameters) {
char buffer[15];
if (xQueue != NULL) {
while (1) {
// Sử dụng xQueuePeek để đọc phần tử từ queue mà không xóa nó
if (xQueuePeek(xQueue, &buffer, portMAX_DELAY) == pdPASS) {
Serial.print("Received: ");
Serial.println(buffer);
// Đọc xong rồi xóa phần tử đó khỏi queue
xQueueReceive(xQueue, &buffer, portMAX_DELAY);
}
}
}
// Xóa task sau khi hoàn thành
vTaskDelete(NULL);
}
void setup() {
// Khởi tạo Serial
Serial.begin(9600);
// Tạo các tác vụ Task1 và Task2
xTaskCreate(Task1, "Task1", 1000, NULL, 1, NULL);
xTaskCreate(Task2, "Task2", 1000, NULL, 1, NULL);
// Bắt đầu scheduler#include <Arduino.h>
#include <Arduino_FreeRTOS.h>
#include <queue.h>
// Định nghĩa queue handle
QueueHandle_t xQueue;
// Định nghĩa các thông điệp
const char *messages[] = {"message 1", "message 2", "message 3", "message 4"};
// Task1: Tạo và ghi đè vào queue
void Task1(void *pvParameters) {
// Tạo queue có thể chứa 3 phần tử, mỗi phần tử là một chuỗi ký tự tối đa 15 ký tự
xQueue = xQueueCreate(3, sizeof(char[15]));
if (xQueue != NULL) {
// Đưa hai phần tử vào queue
xQueueSend(xQueue, (void *)messages[0], portMAX_DELAY);
vTaskDelay(1000 / portTICK_PERIOD_MS); // Để đảm bảo task2 có thời gian để đọc phần tử đầu tiên
xQueueSend(xQueue, (void *)messages[1], portMAX_DELAY);
// Ghi đè hai phần tử khác vào queue
xQueueSend(xQueue, (void *)messages[2], portMAX_DELAY);
vTaskDelay(1000 / portTICK_PERIOD_MS); // Để đảm bảo task2 có thời gian để đọc phần tử thứ hai
xQueueSend(xQueue, (void *)messages[3], portMAX_DELAY);
}
// Xóa task sau khi hoàn thành
vTaskDelete(NULL);
}
// Task2: Đọc và in dữ liệu từ queue
void Task2(void *pvParameters) {
char buffer[15];
if (xQueue != NULL) {
while (1) {
// Sử dụng xQueuePeek để đọc phần tử từ queue mà không xóa nó
if (xQueuePeek(xQueue, &buffer, portMAX_DELAY) == pdPASS) {
Serial.print("Received: ");
Serial.println(buffer);
// Đọc xong rồi xóa phần tử đó khỏi queue
xQueueReceive(xQueue, &buffer, portMAX_DELAY);
}
vTaskDelay(500 / portTICK_PERIOD_MS); // Thêm một khoảng delay để tránh lặp vô hạn quá nhanh
}
}
// Xóa task sau khi hoàn thành
vTaskDelete(NULL);
}
void setup() {
// Khởi tạo Serial
Serial.begin(9600);
// Tạo các tác vụ Task1 và Task2
xTaskCreate(Task1, "Task1", 1000, NULL, 1, NULL);
xTaskCreate(Task2, "Task2", 1000, NULL, 1, NULL);
// Bắt đầu scheduler
vTaskStartScheduler();
}
void loop() {
// Không sử dụng loop() khi sử dụng FreeRTOS
}
vTaskStartScheduler();
}
void loop() {
// Không sử dụng loop() khi sử dụng FreeRTOS
}