🛠 Deux tâches FreeRTOS sur les deux cœurs

ESP32 (original, classe ESP32-WROOM-32) · intermediaire · Schéma : IMG-esp32-intermediaire-1-taches-freertos-2-coeurs.svg — Puce ESP32 double cœur avec deux tâches épinglées sur cœur 0 et cœur 1 échangeant via une file d'attente

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels