🛠 Deux tâches FreeRTOS sur les deux cœurs
Objectifs
Exploiter la vraie force de l'ESP32 : son double cœur Xtensa. Vous créerez deux tâches FreeRTOS épinglées chacune sur un cœur, communicant par une file d'attente (queue). Cas typique : garder le cœur 0 pour la pile Wi-Fi/Bluetooth et le cœur 1 pour votre logique applicative, comme le fait déjà l'Arduino loop.
Matériel
- 1 carte ESP32 DevKit v1
- Un PC avec port série
- Aucune soudure nécessaire
Code complet
#include <WiFi.h>
QueueHandle_t file;
struct Mesure { float t; int rssi; };
void tacheReseau(void*) { // epinglee sur coeur 0, près 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, "réseau", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(tacheConsole, "console", 4096, NULL, 4, NULL, 1);
}
void loop { vTaskDelay(pdMS_TO_TICKS(1000)); }
Vérification attendue
La console affiche chaque seconde une ligne « [coeur 1] t=… s RSSI=… » : la mesure est produite sur le cœur 0, consommée et affichée sur le cœur 1. En supprimant l'épinglage, le numéro de cœur affiché change selon l'ordonnancement de FreeRTOS.
Erreurs fréquentes
- Pile trop petite (4096 octets ici) : un printf un peu gourmand fait planter la tâche (Guru Meditation) ; surveiller uxTaskGetStackHighWaterMark.
- Deux tâches qui écrivent sur Serial en même temps : sortie entrelacée ; centraliser les affichages ou protéger par un mutex.
- Appels Wi-Fi lents faits depuis loop : la pile radio tourne sur le cœur 0, d'où l'intérêt de la séparation des tâches.
- delay fonctionne dans une tâche (il cède la main), mais vTaskDelay(pdMS_TO_TICKS(…)) reste l'écriture explicite de FreeRTOS.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht22.inoArduinooled-i2c.inoArduinoserveur-web.inoArduino