- Fordele ved multi-core processor
- ESP32 og FreeRTOS
- Find ESP32-kerne-ID
- ESP32 Dual Core-programmering
ESP-moduler er populære for deres Wi-Fi-funktioner som ESP8266, ESP-12E osv. Disse er alle effektive Microcontroller-moduler med Wi-Fi-funktioner. Der er endnu et ESP-modul, der er mere kraftfuldt og alsidigt end tidligere ESP-moduler - dets navn er ESP32. Det har Bluetooth- og Wi-Fi-forbindelse, og vi har allerede forklaret BLE-funktionerne i ESP32 og brugt ESP32 i mange IoT-projekter. Men meget få mennesker ved, at ESP32 er en dual-core mikrocontroller.
ESP32 har to 32-bit Tensilica Xtensa LX6-mikroprocessorer, hvilket gør det til en kraftig dual-core (core0 og core1) mikrocontroller. Den fås i to varianter single-core og dual-core. Men dual-core-varianten er mere populær, fordi der ikke er nogen signifikant prisforskel.
ESP32 kan programmeres ved hjælp af Arduino IDE, Espressif IDF, Lua RTOS osv. Under programmering med Arduino IDE kører koden kun på Core1, fordi Core0 allerede er programmeret til RF-kommunikation. Men her er denne vejledning, vi viser, hvordan man bruger begge kerner i ESP32 til at udføre to operationer samtidigt. Her vil den første opgave være at blinke den indbyggede LED, og den anden opgave vil være at hente temperaturdataene fra DHT11-sensoren.
Lad os først se fordelene ved en multi-core processor i forhold til en enkelt kerne.
Fordele ved multi-core processor
- Multi-core processorer er nyttige, når der er mere end 2 processer, der skal arbejde samtidigt.
- Da arbejdet fordeles mellem forskellige kerner, øges dets hastighed, og flere processer kan afsluttes på samme tid.
- Strømforbruget kan reduceres, fordi når en kerne er i inaktiv tilstand, kan den bruges til at lukke de eksterne enheder, der ikke er i brug på det tidspunkt.
- Dual-core processorer skal skifte mellem forskellige tråde sjældnere end single-core processorer, fordi de kan håndtere to ad gangen i stedet for en ad gangen.
ESP32 og FreeRTOS
ESP32-kortet har allerede FreeRTOS-firmware installeret på det. FreeRTOS er et open source-realtidsoperativsystem, som er meget nyttigt i multitasking. RTOS hjælper med at styre ressourcerne og maksimere systemets ydeevne. FreeRTOS har mange API-funktioner til forskellige formål, og ved hjælp af disse API'er kan vi oprette opgaver og få dem til at køre på forskellige kerner.
Komplet dokumentation af FreeRTOS API'er kan findes her. Vi vil forsøge at bruge nogle API'er i vores kode til at opbygge en multitasking-applikation, der kører på begge kerner.
Find ESP32-kerne-ID
Her bruger vi Arduino IDE til at uploade koden til ESP32. For at kende Core ID, som koden kører på, er der en API-funktion
xPortGetCoreID ()
Denne funktion kan kaldes fra void setup () og void loop () -funktionen for at kende kerne-ID'et, som disse funktioner kører på.
Du kan teste denne API ved at uploade nedenstående skitse:
ugyldig opsætning () { Serial.begin (115200); Serial.print ("setup () -funktion kører på kerne:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () -funktion, der kører på core:"); Serial.println (xPortGetCoreID ()); }
Efter uploaden af ovenstående skitse skal du åbne den serielle skærm og du vil opdage, at begge funktioner kører på core1 som vist nedenfor.
Fra ovenstående observationer kan det konkluderes, at standard Arduino-skitsen altid kører på core1.
ESP32 Dual Core-programmering
Arduino IDE understøtter FreeRTOS til ESP32, og FreeRTOS API'er giver os mulighed for at oprette opgaver, der kan køre uafhængigt af begge kerner. Opgaven er det stykke kode, der udfører en vis operation på tavlen som blinkende led, sendetemperatur osv.
Nedenstående funktion bruges til at oprette opgaver, der kan køre på begge kerner. I denne funktion skal vi give nogle argumenter som en prioritet, kerne-id osv.
Følg nu nedenstående trin for at oprette opgave og opgavefunktion.
1. Opret først opgaver i funktionen tomrumsopsætning . Her opretter vi to opgaver, en til at blinke LED efter hvert 0,5 sekund, og en anden opgave er at få temperaturmåling efter hvert 2. sekund.
xTaskCreatePinnedToCore () -funktionen tager 7 argumenter:
- Funktionsnavn til gennemførelse af opgaven (opgave1)
- Ethvert navn, der gives til opgaven (“task1” osv.)
- Stakstørrelse tildelt opgaven i ord (1 ord = 2 bytes)
- Parameter for opgaveinput (kan være NULL)
- Opgavens prioritet (0 er den laveste prioritet)
- Opgavehåndtag (kan være NULL)
- Kerne-id, hvor opgaven kører (0 eller 1)
Nu, oprette TASK1 til at blinke den førte ved at give alle argumenter i xTaskCreatePinnedToCore () funktion.
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
Tilsvarende oprette Task2 for Task2 og gøre core id 1 i 7 th argument.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Du kan ændre prioritet og stakkestørrelse afhængigt af opgavens kompleksitet.
2. Nu implementerer vi Task1code og Task2code- funktionen. Disse funktioner indeholder koden til den krævede opgave. I vores tilfælde blinker den første opgave ledet, og en anden opgave henter temperaturen. Så lav to separate funktioner for hver opgave uden for tomrumsopsætningsfunktionen.
Task1code- funktion til at blinke ombord-ledet efter 0,5 sekunder er implementeret som vist nedenfor.
Void Task1code (void * parameter) { Serial.print ("Task1 kører på kerne"); Serial.println (xPortGetCoreID ()); for (;;) {// uendelig sløjfe digitalWrite (led, HIGH); forsinkelse (500); digitalWrite (førte, LAV) forsinkelse (500); } }
På samme måde implementerer du Task2code- funktionen til at hente temperaturen.
ugyldig Task2code (ugyldig * pvParameters) { Serial.print ("Task2 kører på kerne"); Serial.println (xPortGetCoreID ()); for (;;) { float t = dht.readTemperature (); Serial.print ("Temperatur:"); Serial.print (t); forsinkelse (2000); } }
3. Her forbliver ugyldig sløjfefunktion tom. Som vi allerede ved, kører loop og setup- funktionen på core1, så du også kan implementere core1-opgave i ugyldig loop- funktion.
Nu er kodningsdelen forbi, så upload kun koden ved hjælp af Arduino IDE ved at vælge ESP32-kortet i menuen Funktioner. Sørg for, at du har tilsluttet DHT11-sensoren til pin D13 i ESP32.
Nu kan resultaterne overvåges på Serial Monitor eller Arduino IDE som vist nedenfor:
Komplekse applikationer som realtidssystem kan bygges ved at køre flere opgaver samtidigt ved hjælp af dobbeltkerner i ESP32.
Komplet kode sammen med en demo-video er angivet nedenfor.