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

ESP32 (original, clase 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

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales