Table des matières

, , ,

Programmation multitâche avec l'ESP32

L'ESP32 2 coeurs

cores/esp32/main.cpp

Le sketck s'exécute sur le cœur 1 par défaut.

Pour exécuter du code sur un cœur en particulier.

Dans l'exemple suivant le sketch lance 2 taches, une écrivant sur le port série et l'autre faisant clignoter une LED. Au bout de quelques secondes le sketch tue la tache de clignotement et laisse la LED éteinte.

//la carte ESP32 DEV KIT V1 a une LED intègré sur la sortie digitale 2
const int LED_BUILTIN = 2;
bool killed = false;
 
TaskHandle_t handler_blink_tsk;
TaskHandle_t handler_speak_tsk;
 
void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
 
  xTaskCreatePinnedToCore(
blinkLED,      // Nom de la fonction a executer comme tache
"blink_task",  // nom de la tâche (16 car. max)
1000,          // taille de la pile pour la tâche
NULL,          // arguments pour la fonction
0,             // priorité
&handler_blink_tsk,       // handler pour la tâche
0);            // coeur a utiliser
 
  xTaskCreatePinnedToCore(
speakToMe,      // Nom de la fonction a executer comme tache
"speak_task",   // nom de la tâche (16 car. max)
1000,          // taille de la pile pour la tâche
NULL,          // arguments pour la fonction
0,             // priorité
&handler_speak_tsk,       // handler pour la tâche
1);            // coeur a utiliser
}
 
void loop() {
 
  delay(10000);
  //apres 10 secondes on arrete le clignotement de la LED
  if(killed == false)
  {
    vTaskDelete(handler_blink_tsk);
    digitalWrite(LED_BUILTIN, LOW);
    killed = true;
  }
 
}
 
void blinkLED(void *arg){
  while(true)
  {
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);                       // wait for a second
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);
  }
}
 
void speakToMe(void *arg){
  while(true)
  {
    Serial.print('Nb taches: ');
    Serial .println(uxTaskGetNumberOfTasks());
 
    delay(2000);
  }
}

Quelques fonctions

xTaskCreatePinnedToCore() Creer un tache et la faire executer par un processeur particulier.
uxTaskGetNumberOfTasks() Retourne le nombre total de tâches s'exécutant sur les 2 coeurs.
vTaskDelete() Tuer la tache dont un handle est passé en paramètre.

Références