#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/queue.h>
#include <freertos/stream_buffer.h>
// Define the size of the queue and stream buffer
#define QUEUE_LENGTH 5
#define BUFFER_LENGTH 20
// Declare the queue and stream buffer
QueueHandle_t xQueue;
StreamBufferHandle_t xStreamBuffer;
// Task 1: Send a string over the queue
void Task1(void *pvParameters) {
const char *message = "Hello from Task 1!";
while (1) {
xQueueSend(xQueue, &message, portMAX_DELAY);
vTaskDelay(pdMS_TO_TICKS(1500)); // Send every 1 second
}
}
// Task 2: Receive a string from the queue and print it
void Task2(void *pvParameters) {
char *receivedMessage;
while (1) {
xQueueReceive(xQueue, &receivedMessage, portMAX_DELAY);
Serial.println(receivedMessage);
vTaskDelay(pdMS_TO_TICKS(200)); // Print delay
}
}
// Task 3: Send a string over the stream buffer
void Task3(void *pvParameters) {
const char *message = "Hello from Task 3!";
while (1) {
xStreamBufferSend(xStreamBuffer, (void *)message, strlen(message), portMAX_DELAY);
vTaskDelay(pdMS_TO_TICKS(1500)); // Send every 1.5 seconds
}
}
// Task 4: Receive a string from the stream buffer and print it
void Task4(void *pvParameters) {
char receivedMessage[BUFFER_LENGTH];
size_t bytesRead;
while (1) {
bytesRead = xStreamBufferReceive(xStreamBuffer, (void *)receivedMessage, BUFFER_LENGTH, portMAX_DELAY);
if (bytesRead > 0) {
receivedMessage[bytesRead] = '\0'; // Null-terminate the string
Serial.println(receivedMessage);
}
vTaskDelay(pdMS_TO_TICKS(200)); // Print delay
}
}
void setup() {
Serial.begin(115200);
// Create the queue
xQueue = xQueueCreate(QUEUE_LENGTH, sizeof(char *));
// Create the stream buffer
xStreamBuffer = xStreamBufferCreate(BUFFER_LENGTH, 1);
// // Create tasks
xTaskCreate(Task1, "Task1", 1000, NULL, 1, NULL);
xTaskCreate(Task2, "Task2", 1000, NULL, 2, NULL);
xTaskCreate(Task3, "Task3", 1000, NULL, 1, NULL);
xTaskCreate(Task4, "Task4", 1000, NULL, 2, NULL);
}
void loop() {
// Empty loop, tasks are handling everything
vTaskDelay(pdMS_TO_TICKS(100));
}