So aktivieren Sie Dual-Core-ESP32, um die Dual-Core-Funktion zur gleichzeitigen Ausführung mehrerer Aufgaben zu aktivieren

So aktivieren Sie Dual-Core-ESP32, um die Dual-Core-Funktion zur gleichzeitigen Ausführung mehrerer Aufgaben zu aktivieren

Einführung

Fügen Sie hier eine Bildbeschreibung ein

Das ESP32-WROOM-32-Modul verfügt über zwei integrierte Xtensa® 32-Bit-LX6-MCUs mit geringem Stromverbrauch, und die beiden CPU-Kerne (Kern 0 und Kern 1) können unabhängig voneinander gesteuert werden. Auf beiden Kernen können mehrere Codeteile gleichzeitig ausgeführt werden, wodurch der ESP32 Multitasking ausführen kann (Codeteile, die bestimmte Dinge ausführen). Arduino IDE aktiviert standardmäßig Core 1. ESP32 kann ein Echtzeitbetriebssystem RTOS ausführen und mehrere unabhängig laufende Aufgaben parallel verarbeiten. Um einen bestimmten Teil des Codes einem bestimmten Kern zuzuordnen, muss eine Aufgabe erstellt werden. Wenn Sie eine Aufgabe erstellen, können Sie auswählen, auf welchem ​​Kern sie ausgeführt werden soll und welche Priorität sie hat. Prioritätswerte beginnen bei 0, wobei 0 die niedrigste Priorität ist. Der Prozessor führt zuerst Aufgaben mit höherer Priorität aus.

Fügen Sie hier eine Bildbeschreibung ein

Überprüfen Sie, welcher Kern des ESP32 gerade Aufgaben ausführt

Öffnen Sie die Arduino IDE und laden Sie den folgenden Code auf den ESP32 hoch.
Rufen Sie die Funktion xPortGetCoreID() auf, um die Kernnummer zu erhalten.

void setup() {
    
    
  Serial.begin(115200);
  Serial.print("setup() running on core ");
  Serial.println(xPortGetCoreID());
}

void loop() {
    
    
  Serial.print("loop() running on core ");
  Serial.println(xPortGetCoreID());
}

Öffnen Sie den seriellen Monitor, um zu sehen, dass der aktuelle Kern 1 des ESP32 Aufgaben ausführt
Fügen Sie hier eine Bildbeschreibung ein

Dual-Cores führen Aufgaben gleichzeitig aus

Öffnen Sie die Arduino IDE und laden Sie den folgenden Code auf ESP32 hoch

TaskHandle_t Task1;
TaskHandle_t Task2;

// LED pins
const int led1 = 2;
const int led2 = 4;
void setup() {
    
    
Serial.begin(115200); 
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);

  //create a task that will be executed in the Task1code() function, with priority 1 and executed on core 0
  xTaskCreatePinnedToCore(
                    Task1code,   /* Task function. */
                    "Task1",     /* name of task. */
                    10000,       /* Stack size of task */
                    NULL,        /* parameter of the task */
                    1,           /* priority of the task */
                    &Task1,      /* Task handle to keep track of created task */
                    0);          /* pin task to core 0 */                  
  delay(500); 

  //create a task that will be executed in the Task2code() function, with priority 1 and executed on core 1
  xTaskCreatePinnedToCore(
                    Task2code,   /* Task function. */
                    "Task2",     /* name of task. */
                    10000,       /* Stack size of task */
                    NULL,        /* parameter of the task */
                    1,           /* priority of the task */
                    &Task2,      /* Task handle to keep track of created task */
                    1);          /* pin task to core 1 */
    delay(500); 
}

//Task1code: blinks an LED every 1000 ms
void Task1code( void * pvParameters ){
    
    
  Serial.print("Task1 running on core ");
  Serial.println(xPortGetCoreID());

  for(;;){
    
    
    digitalWrite(led1, HIGH);
    delay(1000);
    digitalWrite(led1, LOW);
    delay(1000);
  } 
}

//Task2code: blinks an LED every 700 ms
void Task2code( void * pvParameters ){
    
    
  Serial.print("Task2 running on core ");
  Serial.println(xPortGetCoreID());

  for(;;){
    
    
    digitalWrite(led2, HIGH);
    delay(700);
    digitalWrite(led2, LOW);
    delay(700);
  }
}

void loop() {
    
    
  
}

Dieser Code wird auf Kern 0 ausgeführt, damit LED1 alle 1000 ms blinkt, und auf Kern 1 ausgeführt, damit LED2 alle 700 ms blinkt. Beide Aufgaben haben die Priorität 1, werden gleichzeitig ausgeführt und Kernel-Informationen werden auf dem seriellen Monitor ausgedruckt. Wenn die Dual-Core-Ausführung nicht aktiviert ist und die Standard-Single-Core-Sequenz verwendet wird, können LED1 und LED2 nicht gleichzeitig in unterschiedlichen Intervallen blinken.
Wenn Sie die Aufgabe während der Aufgabenausführung löschen möchten, können Sie die Funktion vTaskDelete(Task1) aufrufen.
Fügen Sie hier eine Bildbeschreibung ein

Zusammenfassen

ESP32 mit Dual-Core-Funktion ermöglicht es uns, das Programm zu vereinfachen und die Effizienz beim Entwerfen von Anwendungen mit parallelen Funktionen zu verbessern. Verwenden Sie beispielsweise einen Kern, um Sensormesswerte zu erfassen, und einen anderen Kern, um andere Aufgaben basierend auf den Messwerten auszuführen.

Supongo que te gusta

Origin blog.csdn.net/qq_42250136/article/details/133929303
Recomendado
Clasificación