ESP32 - Uso di entrambi i core della CPU per i tuoi progetti

Oggi vi voglio mostrare che "il potere e le risorse" in ESP32. È meno noto, è che il nostro ESP32 microcontrollore non è un singolo processore, ma piuttosto un multi-processore con 2 core. ESP stanno lavorando 2 Xtensa 32-bit LX6 CPU condivisione di RAM e ROM. Così si differenzia dal suo predecessore, il ESP8266. Due nuclei che hanno nomi diversi. CPU 0 è anche chiamato Protocollo di CPU (PRO_CPU) e CPU 1 CPU Applicazione (APP_CPU). La CPU 0 controlli WLAN, Bluetooth e altre periferiche interne, come SPI, I2C, ADC, ecc.... mentre la CPU 1 è disponibile per il nostro programma utente. Scenette che scriviamo nel ciclo principale e caricare le ESP sono sempre eseguito sulla CPU 1, senza eccezioni.Il APP_CPU (CPU 0) è omesso per impostazione predefinita per l'applicazione del codice. Il diagramma seguente mostra la distribuzione standard di compiti tra Cpu:

Esso può essere visto che 2 core, che quasi raddoppia le prestazioni di ESP32, non è direttamente disponibile per l'uso gratuito.

Tuttavia, ESP Framework fornisce anche funzioni con l'IDE di Arduino, che consentono di distribuire le singole attività per la ESP32 Cpu e quindi per la CPU.

TaskHandle_t NamedesTaskhadle;

 a disposizione. Per creare una nuova attività, possiamo utilizzare la funzione xTaskCreatePinnedToCore con le seguenti opzioni:

 

xTaskCreatePinnedToCore (
CoreTask0, / - Attività funzione chiamata - /
"Task1", / - Nome dell'attività Qualsiasi Nome /
1000, / disponibile memoria heap del compito - /
NULL / - possibilmente parametro della task - /
1, / - task di priorità - /
& Core0TaskHnd, / - usato compito di gestire - /

 

il Nostro obiettivo è quello di eseguire codice personalizzato come compito la CPU1, così come mostrato di seguito, il codice viene eseguito come un'attività sul CPU1 indipendente di CPU0, come illustrato nell'immagine seguente:

 

 

Possiamo ora inserire il seguente codice di esempio nella nostra IDE e caricarlo sul ESP32:

 

 

TaskHandle_t  Core0TaskHnd ;  
TaskHandle_t  Core1TaskHnd ; 

void setup() 
{   di Serie.iniziano(9600);     xTaskCreatePinnedToCore(CoreTask0,"CPU_0",1000,NULL,1,&Core0TaskHnd,0);   xTaskCreatePinnedToCore(CoreTask1,"CPU_1",1000,NULL,1,&Core0TaskHnd,1);
}

void loop() 
{   Seriale.di stampa ("Applicazione della CPU è sul "core":");   Serial.println (xPortGetCoreID());   ritardo (500);
}  

void CoreTask0( void * parametro ) 
{    per la (;;)    {      Serie.di stampa("CoreTask0 corre sul Core: ");      Seriale.println(xPortGetCoreID());      resa();     ritardo (600);   } 
} 

void CoreTask1( void * parametro ) 
{    per la (;;)    {      Serie.di stampa("CoreTask1 corre sul "Core": ");      Serial.println(xPortGetCoreID());      ritardo (700);   } 
}

 

 

.

Mit der ESP internen Funktion xPortGetCoreID() können wir uns die Kernnummer ausgeben lassen, auf dem unser Codeabschnitt gerade läuft. Diese Kernnummer kann entweder den Wert 0 oder 1 annehmen. Diese Funktion nutzen wir, um seriell Informationen darüber auszugeben, auf cui Core der Attività gerade läuft:

uscita Seriale mostra, la cui funzione è in esecuzione su cui core

Wir sehen nun der Ausgabe das insgesamt 3 Attività di laufen. Ein Attività mit dem Namen "CoreTask 0" auf CPU 0, ein Attività mit dem Namen "CoreTask1" auf CPU 1 sowie unser Hauptscheifentask (loop) auf Core 1.

Bis jetzt klingt alles zu schön, um wahr zu sein. In der Tat haben wir mit der Nutzung der CPU 0 ein Problema, wir dem Beachtung schenken dobbiamo: Wie auf der oberen Bild gezeigt, läuft auf der CPU 0 auch der Kernel Protokoll Attività. Dieser Attività kümmert sich unter anderem auch um den WiFi und Stack TCP/IP. Wenn dieser längeren Zeit nicht ausgeführt wird, weil zum Beispiel unser Attività zu viel CPU Zeit fordert, kann das Sistema insgesamt instabil werden und abstürzen. Noi dobbiamo anche dafür Sorge trage, dass unser eigener Attività keine oder nur massima sehr klein bemessene ritardo-Anweisungen erhält, damit der Kernel Protokoll Attività genügend Rechenzeit zugewiesen bekommt.

 

em aufmerksamen Reader wird ein weiteres Problema des Codici aufgefallen sein: Das Programm crea file pdf partendo 3 Compiti, die unabhängig voneinander z.T. auf unterschiedlichen CPU laufen, sich dennoch aber eine Ressource (den COM Port des ESP) teilen. Da grundsätzlich morire Attività nichts voneinander "wissen" und somit auch nicht, wann eine Ressource von einem anderen Attività belegt oder verändert wird., kann es hier zu Kollisionen venire. Diese verursachen ein nicht vorhersagbares Ergebnis, da nicht genau bestimmt werden kann, zu, che è Zeit che è Compito morire Ressource verwendet. Solche Konstellationen können dann im besten Caduta entweder in einer programmatischen Gara Kondition oder gar in einem Deadlock enden. Era genau ein Deadlock ist, spiega das Philosophenproblem, dove 5 filosofi sedersi intorno ad un spaghetti tavola, molto vivaci. Voglio per evitare reciprocamente esclusione reciproca problemi con la mutua esclusione ( mutex ) e le collisioni quando si accede a risorse condivise di ricerca come variabili o interfacce di evitare,

Che ci mette in mezzo l'argomento della comunicazione interprocesso . Abbiamo imparato molto circa le attività e il multitasking.

Di più su la generazione di attività e il Funzionamento in Tempo Reale del Sistema (RTOS) è disponibile nella seconda parte di questa serie o ::

https://exploreembedded.com/wiki/index.php?title=Hello%20World%20with%20ESP32%20Explained

E ora divertitevi a sperimentare.


 

 

Esp-32Grundlagen software

3 Kommentare

doob

doob

{
Serial.begin(9600);
xTaskCreatePinnedToCore(CoreTask0,“CPU_0”,1000,NULL,1,&Core0TaskHnd,0);
xTaskCreatePinnedToCore(CoreTask1,“CPU_1”,1000,NULL,1,&Core0TaskHnd,1);
}
noch ein Tippfehler? sollte es beim zweiten pinning nicht Core1TaskHnd heißen?

Sven

Sven

CPU 1 ist für das Anwenderprogramm verantwortlich.

Der Tippfehler wird bestimmt zeitnah korrigiert.

veit

veit

Diese Namentliche Unterscheidung wird getroffen, um zu verdeutlichen, dass die CPU 0 das WLAN, Bluetooth und andere interne Peripheriegeräte wie SPI, I2C, ADC usw. steuert, während die CPU 0 für unser Anwenderprogramm zur Verfügung steht.

bitte korrigieren …. irgendwas müsste von cpu 1 gemacht werden

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Post di blog consigliati

  1. Installa ESP32 ora dal gestore del consiglio di amministrazione
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - Programmazione ESP tramite WLAN