ESP32 - Gebruik van beide CPU-kernen voor uw eigen projecten

Vandaag wil ik laten zien welke "power resources" zijn in op ESP32. Het is veel minder bekend dat onze ESP32 microcontroller geen enkele processor is, maar eerder een multi-processor met 2 cores. In de ESP werken 2 Xtensa 32-bit LX6 CPU delen RAM en ROM. Aldus verschilt het van zijn voorganger, ESP8266. De twee kernen hebben verschillende namen. CPU 0 wordt ook wel Protocol CPU (PRO_CPU) en CPU 1 Application CPU (APP_CPU) genoemd. De CPU 0 regelt de WLAN, Bluetooth en andere interne randapparatuur zoals SPI, I2C, ADC, enz., terwijl de CPU 1 beschikbaar is voor ons gebruikersprogramma. Skits die we schrijven in de hoofdlus en uploaden naar de ESP worden altijd uitgevoerd op de CPU 1 zonder uitzondering.De APP_CPU (CPU 0) wordt standaard weggelaten voor de toepassingscode. In het volgende diagram ziet u de standaardverdeling van taken tussen de CPU's:

Men kan zien dat 2 kern, die bijna de prestaties van ESP32 verdubbelt, niet direct beschikbaar voor vrij gebruik is.

Het ESP Framework biedt echter ook functies met de Arduino IDE waarmee afzonderlijke taken kunnen worden gedistribueerd naar de ESP32-cpu's en dus naar de CPU. 

TaskHandle_t naam van de taakhadle;

 tot verwijdering. Als u een nieuwe taak wilt maken, gebruiken we de functie xTaskCreatePinnedToCore met de volgende opties:

 

xTaskCreatePinnedToCore (
CoreTask0, / - Taakfunctie die moet worden aangeroepen - /
"Taak1", / - Naam van de taak Elke naam - /
1000, / - beschikbare heap geheugen van de taak - /
NULL, / - mogelijk parameter van de taak - /
1, / - taakprioriteit - /
& Core0TaskHnd, / - gebruikte taakgreep - /

 

Ons doel is om aangepaste code uit te voeren als een taak op de CPU1, dus zoals hieronder weergegeven, onze code draait als een taak op de CPU1 onafhankelijk van de CPU0, zoals geïllustreerd in de volgende afbeelding:

 

 

We voeren nu de volgende voorbeeldcode in onze IDE in en uploaden deze naar de ESP32:

 

 

TaskHandle_t  Core0TaskHnd Core0TaskHnd ;  
TaskHandle_t  Core1TaskHnd Core1TaskHnd ; 

Void Setup() 
{   Seriële.Beginnen(9600);     xTaskCreatePinnedToCore(CoreTask0 CoreTask0,"CPU_0",1000,Null Null Null,1,&Core0TaskHnd Core0TaskHnd,0);   xTaskCreatePinnedToCore(CoreTask1,"CPU_1",1000,Null Null Null,1,&Core0TaskHnd Core0TaskHnd,1);
}

Void Lus() 
{   Seriële.Afdrukken ("Application CPU is op core:");   Seriële.println (xPortGetCoreID());   Vertraging (500);
}  

Void CoreTask0 CoreTask0( Void * Parameter ) 
{    Voor (;;)    {      Seriële.Afdrukken("CoreTask0 draait op Core: ");      Seriële.println(xPortGetCoreID());      Opbrengst();     Vertraging (600);   } 
} 

Void CoreTask1( Void * Parameter ) 
{    Voor (;;)    {      Seriële.Afdrukken("CoreTask1 draait op Core: ");      Seriële.println(xPortGetCoreID());      Vertraging (700);   } 
}

 

 

.

Met de ESP interne functie xPortGetCoreID() kunnen we het kernnummer krijgen waarop onze codesectie momenteel wordt uitgevoerd. Dit kerngetal kan 0 of 1 zijn. We gebruiken deze functie om seriële informatie uit te voeren over de kern waarop de taak momenteel wordt uitgevoerd:

Seriële uitvoer geeft aan op welke taak

We zien nu in de uitvoer dat er in totaal 3 taken worden uitgevoerd. CoreTask 0 op CPU 0, een taak genaamd CoreTask1 op CPU 1, en onze hoofdlogboektaak (lus) op Core 1.

Tot nu toe klinkt alles te mooi om waar te zijn. In feite hebben we een probleem met het gebruik van CPU 0 waar we aandacht aan moeten besteden: Zoals getoond op de bovenste afbeelding, draait de kernel protocol taak ook op de CPU 0. Deze taak zorgt ook voor de WiFi- en TCP/IP-stack. Als deze langere tijd niet wordt uitgevoerd omdat, bijvoorbeeld, onze taak vereist te veel CPU-tijd, kan het systeem instabiel worden en crashen in het algemeen. We moeten er dus voor zorgen dat onze eigen taak geen vertragingsverklaringen of slechts zeer kleine vertragingsinstructies ontvangt, zodat de kernelprotocoltaak voldoende rekentijd krijgt.

 

em attente lezer zal hebben gemerkt een ander probleem van de code: Het programma genereert 3 taken, die onafhankelijk draaien op verschillende CPU's, maar nog steeds delen van een bron (de COM-poort van de ESP). Aangezien de taken niets van elkaar "weten" en daarom niet weten wanneer een resource wordt bezet of gewijzigd door een andere taak, kunnen hier botsingen plaatsvinden. Deze veroorzaken een onvoorspelbaar resultaat omdat het niet mogelijk is om precies te bepalen wanneer de resource welke taak gebruikt. Dergelijke constellaties kunnen dan, in het beste geval, ofwel in een programmatische Race Conditie of zelfs in een Impasse Eindigt. Wat precies een impasse is, verklaart de Het probleem van de filosoof, waar 5 filosofen zitten rond een spaghetti tafel, zeer levendig. Ik wil. om wederzijds te voorkomen Uitsluiting wederzijdse kwesties door wederzijdse uitsluiting ( Mutex ) en botsingen bij het openen van gedeelde bronnen zoeken als variabelen of interfaces te voorkomen,

Dat plaatst ons in het midden van het onderwerp interprocescommunicatie . We hebben veel geleerd over taken en multitasking.

Meer over taakgeneratie en het Real Time Operation System (RTOS) is beschikbaar in het tweede deel van deze serie of over::

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

En nu veel plezier experimenteren.


 

 

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

Aanbevolen blog berichten

  1. Installeer ESP32 nu van de raad van bestuur
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmeren via Wi-Fi