#include <Arduino.h>
#include <Arduino_FreeRTOS.h>
#include <task.h>
#include <queue.h>
// Định nghĩa kích thước của chuỗi và hàng đợi
#define QUEUE_LENGTH 6
#define ITEM_SIZE 20
// Định nghĩa tên hàng đợi và các tác vụ
QueueHandle_t xQueue;
TaskHandle_t HTask1, HTask2;
// Tạo dữ liệu chuỗi cần gửi vào hàng đợi
const char* messages[] = {"CT03-Hello", "DT02 Hi", "AT-Welcome"};
// Tác vụ gửi dữ liệu vào hàng đợi
void Task1(void* pvParameters) {
char message[ITEM_SIZE]; // Mảng ký tự tĩnh
for (int i = 0; i < 3; i++) {
// Sao chép chuỗi vào mảng message trước khi gửi
memcpy(message, messages[i], ITEM_SIZE);
message[ITEM_SIZE - 1] = '\0'; // Đảm bảo kết thúc chuỗi bằng NULL
// Gửi mỗi chuỗi vào hàng đợi
if (xQueueSend(xQueue, (void*)&message, portMAX_DELAY) != pdPASS) {
Serial.println("Không thể gửi vào hàng đợi");
} else {
Serial.print("Đã gửi: ");
Serial.println(message);
}
vTaskDelay(pdMS_TO_TICKS(1000)); // Delay 1 giây
}
vTaskDelete(NULL); // Kết thúc Task1
}
// Tác vụ đọc dữ liệu từ hàng đợi
void Task2(void* pvParameters) {
char receivedMessage[ITEM_SIZE];
while (1) {
if (xQueueReceive(xQueue, &receivedMessage, portMAX_DELAY) == pdPASS) {
// In ra phần tử đã nhận
Serial.print("Đã nhận: ");
Serial.println(receivedMessage);
// In ra số phần tử có thể đọc và không gian khả dụng của hàng đợi
UBaseType_t uxMessagesWaiting = uxQueueMessagesWaiting(xQueue);
UBaseType_t uxSpaceAvailable = uxQueueSpacesAvailable(xQueue);
Serial.print("Số phần tử có thể đọc: ");
Serial.println(uxMessagesWaiting);
Serial.print("Không gian khả dụng còn lại: ");
Serial.println(uxSpaceAvailable);
}
vTaskDelay(pdMS_TO_TICKS(1000)); // Delay 1 giây
}
}
void setup() {
// Khởi tạo Serial Monitor
Serial.begin(9600);
// Tạo hàng đợi với kích thước 6 phần tử và mỗi phần tử có kích thước 20 ký tự
xQueue = xQueueCreate(QUEUE_LENGTH, ITEM_SIZE);
if (xQueue == NULL) {
Serial.println("Không thể tạo hàng đợi");
while(1);
}
// Tạo các tác vụ với ưu tiên
xTaskCreate(Task1, "Task1", 250, NULL, tskIDLE_PRIORITY + 1, &HTask1);
xTaskCreate(Task2, "Task2", 250, NULL, tskIDLE_PRIORITY + 1, &HTask2);
}
void loop() {
// Không cần làm gì trong loop() vì FreeRTOS quản lý các tác vụ
}