2. 3.1 Queues — le mécanisme fondamental
Une queue FreeRTOS est un FIFO thread-safe. Elle copie les données (pas de pointeur partagé dangereux). La tâche productrice écrit, la tâche consommatrice lit. Si la queue est pleine, le producteur attend (ou abandonne avec timeout 0). Si la queue est vide, le consommateur se bloque.
#include "freertos/queue.h"
// Créer une queue de 10 éléments de type float
QueueHandle_t xQueueTemp = xQueueCreate(10, sizeof(float));
// Producteur (dans task_temp_sensor)
float temperature = read_dht22();
xQueueSend(xQueueTemp, &temperature, pdMS_TO_TICKS(100)); // timeout 100 ms
// Consommateur (dans task_display)
float received_temp;
if (xQueueReceive(xQueueTemp, &received_temp, pdMS_TO_TICKS(500)) == pdTRUE) {
display_temperature(received_temp);
}
Choisir la taille de la queue : 5-10 éléments pour découpler producteur/consommateur sans consommer trop de RAM. Sur ESP32, chaque élément occupe sizeof(type) bytes dans le heap FreeRTOS.
API essentielle :
| Fonction | Usage |
|---|---|
xQueueCreate(len, item_size) |
Crée la queue |
xQueueSend(q, &item, timeout) |
Envoie à la fin (FIFO) |
xQueueSendToFront(q, &item, timeout) |
Envoie en tête (priorité) |
xQueueReceive(q, &item, timeout) |
Retire + copie un item |
xQueuePeek(q, &item, timeout) |
Lit sans retirer |
uxQueueMessagesWaiting(q) |
Nombre d'items en attente |
xQueueSendFromISR(q, &item, &hptw) |
Depuis une ISR |