#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
static QueueHandle_t msgQueue;
void senderTask(void *pvParameters) {
int count = 0;
while (1) {
char *msg = malloc(50);
if (msg == NULL) {
printf("Malloc failed in sender\n");
break;
}
// Prepare a message in the allocated buffer
snprintf(msg, 50, "Hello from sender, count=%d", count++);
// Send the pointer to the message via queue
if (!xQueueSend(msgQueue, &msg, pdMS_TO_TICKS(100))) {
printf("Failed to send message pointer\n");
free(msg); // free if not successfully sent
} else {
// Mistake: Freeing the message immediately after sending
// free(msg); // message is freed while receiver may not have processed it yet
}
// **Fix:** Do NOT free here. Transfer ownership to receiver task.
// (Receiver should free the message after using it.)
vTaskDelay(pdMS_TO_TICKS(1000));
}
vTaskDelete(NULL);
}
void receiverTask(void *pvParameters) {
char *receivedMsg = NULL;
while (1) {
if (xQueueReceive(msgQueue, &receivedMsg, portMAX_DELAY)) {
// Use the received message pointer
printf("Receiver got: %s\n", receivedMsg);
// Here, receivedMsg might be pointing to freed memory (undefined content).
// If the sender freed it already, this use is invalid.
free(receivedMsg); // **Fix:** Only free here if sender did not free the memory.
}
// Simulate processing time
vTaskDelay(pdMS_TO_TICKS(500));
}
// vTaskDelete(NULL); // (Not reached in this example, as receiver runs indefinitely)
}
void app_main() {
// Create a queue to send message pointers between tasks
msgQueue = xQueueCreate(5, sizeof(char *));
xTaskCreate(senderTask, "SenderTask", 4096, NULL, 1, NULL);
xTaskCreate(receiverTask, "ReceiverTask", 4096, NULL, 1, NULL);
vTaskDelete(NULL);
}