🛠 Deux tâches FreeRTOS sur les deux cœurs
Objetivos
Aprovechar la verdadera fuerza del ESP32: su doble núcleo Xtensa. Crearás dos tareas de FreeRTOS fijadas cada una en un núcleo, que se comunican mediante una cola de espera (queue). Caso típico: reservar el núcleo 0 para la pila de Wi-Fi/Bluetooth y el núcleo 1 para tu lógica de aplicación, tal como ya hace el loop de Arduino.
Material
- 1 placa ESP32 DevKit v1
- Un PC con puerto serie
- No se requiere soldadura
Código completo
#include <WiFi.h>
QueueHandle_t file;
struct Mesure { float t; int rssi; };
void tacheReseau(void*) { // epinglee sur coeur 0, pres de la pile Wi-Fi
for (;;) {
Mesure m;
m.t = millis / 1000.0f;
m.rssi = WiFi.RSSI;
xQueueSend(file, &m, portMAX_DELAY);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void tacheConsole(void*) { // epinglee sur coeur 1
Mesure m;
for (;;) {
if (xQueueReceive(file, &m, portMAX_DELAY)) {
Serial.printf("[coeur %d] t=%.0f s RSSI=%d\n",
xPortGetCoreID, m.t, m.rssi);
}
}
}
void setup {
Serial.begin(115200);
file = xQueueCreate(16, sizeof(Mesure));
WiFi.mode(WIFI_STA);
xTaskCreatePinnedToCore(tacheReseau, "reseau", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(tacheConsole, "console", 4096, NULL, 4, NULL, 1);
}
void loop { vTaskDelay(pdMS_TO_TICKS(1000)); }
Verificación esperada
La consola muestra cada segundo una línea « [núcleo 1] t=… s RSSI=… »: la medición se produce en el núcleo 0, se consume y se muestra en el núcleo 1. Si eliminas el fijado al núcleo, el número de núcleo mostrado cambia según la planificación de FreeRTOS.
Errores frecuentes
- Pila demasiado pequeña (4096 bytes aquí): un printf un poco exigente hace fallar la tarea (Guru Meditation); vigila uxTaskGetStackHighWaterMark.
- Dos tareas que escriben en Serial al mismo tiempo: salida entrelazada; centraliza las impresiones o protégelas con un mutex.
- Llamadas lentas a Wi-Fi realizadas desde loop: la pila de radio funciona en el núcleo 0, de ahí la importancia de la separación de tareas.
- delay funciona en una tarea (cede el control), pero vTaskDelay(pdMS_TO_TICKS(…)) sigue siendo la escritura explícita de FreeRTOS.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino