- Fördelar med flerkärnig processor
- ESP32 och FreeRTOS
- Hitta ESP32-kärn-ID
- ESP32 Dual Core-programmering
ESP-moduler är populära för sina Wi-Fi-funktioner som ESP8266, ESP-12E, etc. Dessa är alla kraftfulla Microcontroller-moduler med Wi-Fi-funktioner. Det finns ytterligare en ESP-modul som är mer kraftfull och mångsidig än tidigare ESP-moduler - dess namn är ESP32. Den har Bluetooth- och Wi-Fi-anslutning och vi har redan förklarat BLE-funktioner i ESP32 och använt ESP32 i många IoT-projekt. Men väldigt få människor vet att ESP32 är en dubbelkärnig mikrokontroller.
ESP32 har två 32-bitars Tensilica Xtensa LX6-mikroprocessorer vilket gör den till en kraftfull mikrokontroller med dubbla kärnor (core0 och core1). Den finns i två varianter med en och två kärnor. Men dual-core-varianten är mer populär eftersom det inte finns någon signifikant prisskillnad.
ESP32 kan programmeras med Arduino IDE, Espressif IDF, Lua RTOS etc. Under programmering med Arduino IDE körs koden bara på Core1 eftersom Core0 redan är programmerat för RF-kommunikation. Men här är den här guiden vi visar hur man använder båda kärnorna i ESP32 för att utföra två operationer samtidigt. Här blir den första uppgiften att blinka den inbyggda lysdioden och den andra uppgiften är att hämta temperaturdata från DHT11-sensorn.
Låt oss först se fördelarna med en flerkärnig processor jämfört med en enda kärna.
Fördelar med flerkärnig processor
- Flerkärniga processorer är användbara när det finns fler än två processer att arbeta samtidigt.
- När arbetet fördelas mellan olika kärnor ökar hastigheten och flera processer kan avslutas samtidigt.
- Strömförbrukningen kan minskas eftersom när någon kärna är i viloläge kan den användas för att stänga av kringutrustning som inte används vid den tiden.
- Dual-core-processorer måste växla mellan olika trådar mindre ofta än single-core-processorer eftersom de kan hantera två åt gången istället för en i taget.
ESP32 och FreeRTOS
ESP32-kortet har redan FreeRTOS-firmware installerat på den. FreeRTOS är ett open source-realtidsoperativsystem som är mycket användbart vid multitasking. RTOS hjälper till att hantera resurserna och maximera systemets prestanda. FreeRTOS har många API-funktioner för olika ändamål och med hjälp av dessa API: er kan vi skapa uppgifter och få dem att köras på olika kärnor.
Komplett dokumentation av FreeRTOS API finns här. Vi kommer att försöka använda några API: er i vår kod för att bygga en multitasking-applikation som körs på båda kärnorna.
Hitta ESP32-kärn-ID
Här kommer vi att använda Arduino IDE för att ladda upp koden till ESP32. För att känna till kärn-ID som koden körs på finns det en API-funktion
xPortGetCoreID ()
Denna funktion kan anropas från void setup () och void loop () för att känna till kärn-ID som dessa funktioner körs på.
Du kan testa detta API genom att ladda upp skissen nedan:
ogiltig installation () { Serial.begin (115200); Serial.print ("setup () -funktion som körs på core:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () function running on core:"); Serial.println (xPortGetCoreID ()); }
Efter att ha laddat upp ovanstående skiss öppnar du den seriella bildskärmen och du kommer att upptäcka att båda funktionerna körs på core1 som visas nedan.
Av ovanstående observationer kan man dra slutsatsen att standardskissen för Arduino alltid körs på core1.
ESP32 Dual Core-programmering
Arduino IDE stöder FreeRTOS för ESP32 och FreeRTOS API: er tillåter oss att skapa uppgifter som kan köras oberoende på båda kärnorna. Uppgiften är den kod som utför en del operationer på tavlan som blinkande led, sändningstemperatur etc.
Funktionen nedan används för att skapa uppgifter som kan köras på båda kärnorna. I den här funktionen måste vi ge några argument som en prioritet, kärn-id, etc.
Följ nu stegen nedan för att skapa uppgift och uppgiftsfunktion.
1. Skapa först uppgifter i tomrumsinställningsfunktionen . Här skapar vi två uppgifter, en för att blinka LED efter var 0,5 sekund och en annan uppgift är att få temperaturavläsning varannan sekund.
xTaskCreatePinnedToCore () -funktionen tar 7 argument:
- Funktionsnamn för att genomföra uppgiften (uppgift1)
- Alla namn som ges till uppgiften (“task1”, etc)
- Stackstorlek tilldelad uppgiften i ord (1 ord = 2byte)
- Parameter för aktivitetsinmatning (kan vara NULL)
- Uppgiftens prioritet (0 är den lägsta prioriteten)
- Aktivitetshandtag (kan vara NULL)
- Kärn-id där uppgiften ska köras (0 eller 1)
Skapa nu Task1 för att blinka ledningen genom att ge alla argument i xTaskCreatePinnedToCore () -funktionen.
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
På samma sätt skapar du Task2 för Task2 och gör core id 1 i det sjunde argumentet.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Du kan ändra prioritet och stapelstorlek beroende på komplexiteten i uppgiften.
2. Nu implementerar vi Task1code och Task2code- funktionen. Dessa funktioner innehåller koden för den önskade uppgiften. I vårt fall kommer den första uppgiften att blinka ledningen och en annan uppgift kommer att hämta temperaturen. Så gör två separata funktioner för varje uppgift utanför tomrumsinställningsfunktionen.
Task1code- funktion för att blinka ombord-ledd efter 0,5 sekunder implementeras enligt nedan.
Void Task1code (void * parameter) { Serial.print ("Task1 running on core"); Serial.println (xPortGetCoreID ()); för (;;) {// oändlig slinga digitalWrite (led, HÖG); fördröjning (500); digitalWrite (ledda, LÅG); fördröjning (500); } }
På samma sätt implementera Task2code- funktionen för att hämta temperaturen.
void Task2code (void * pvParameters) { Serial.print ("Task2 körs på kärnan"); Serial.println (xPortGetCoreID ()); för (;;) { float t = dht.readTemperature (); Serial.print ("Temperatur:"); Serial.print (t); fördröjning (2000); } }
3. Här void loop funktion kommer att förbli tom. Som vi redan vet att loop- och installationsfunktionen körs på core1 så att du också kan implementera core1-uppgiften i void loop- funktionen.
Nu är kodningsdelen över, så ladda bara upp koden med Arduino IDE genom att välja ESP32-kortet i Verktyg-menyn. Se till att du har anslutit DHT11-sensorn till stift D13 i ESP32.
Nu kan resultaten övervakas på Serial Monitor eller Arduino IDE enligt nedan:
Komplexa applikationer som realtidssystem kan byggas genom att köra flera uppgifter samtidigt med dubbla kärnor i ESP32.
Komplett kod tillsammans med en demo-video ges nedan.