- Fordeler med flerkjerneprosessor
- ESP32 og FreeRTOS
- Finne ESP32 kjerne-ID
- ESP32 Dual Core-programmering
ESP-moduler er populære for sine Wi-Fi-funksjoner som ESP8266, ESP-12E, etc. Disse er alle kraftige mikrokontrollermoduler med Wi-Fi-funksjoner. Det er en ESP-modul til som er kraftigere og mer allsidig enn tidligere ESP-moduler - dens navn er ESP32. Den har Bluetooth og Wi-Fi-tilkobling, og vi har allerede forklart BLE-funksjonene til ESP32 og brukt ESP32 i mange IoT-prosjekter. Men de færreste vet at ESP32 er en dual-core mikrokontroller.
ESP32 har to 32-biters Tensilica Xtensa LX6 mikroprosessorer, noe som gjør den til en kraftig mikrocontroller med to kjerner (core0 og core1). Den er tilgjengelig i to varianter med en og to kjerner. Men dual-core-varianten er mer populær fordi det ikke er noen betydelig prisforskjell.
ESP32 kan programmeres ved hjelp av Arduino IDE, Espressif IDF, Lua RTOS, etc. Mens du programmerer med Arduino IDE, kjører koden bare på Core1 fordi Core0 allerede er programmert for RF-kommunikasjon. Men her er denne opplæringen, vi vil vise hvordan du bruker begge kjernene til ESP32 til å utføre to operasjoner samtidig. Her vil den første oppgaven være å blinke den innebygde LED-en, og den andre oppgaven vil være å hente temperaturdataene fra DHT11-sensoren.
La oss først se fordelene med en flerkjerneprosessor fremfor en enkelt kjerne.
Fordeler med flerkjerneprosessor
- Multikjerneprosessorer er nyttige når det er mer enn to prosesser som skal fungere samtidig.
- Ettersom arbeidet er fordelt på forskjellige kjerner, øker hastigheten og flere prosesser kan avsluttes samtidig.
- Strømforbruket kan reduseres fordi når en hvilken som helst kjerne er i hvilemodus enn den, kan den brukes til å slå av eksterne enheter som ikke er i bruk på det tidspunktet.
- Dual-core prosessorer må bytte mellom forskjellige tråder sjeldnere enn single-core prosessorer fordi de kan håndtere to på en gang i stedet for en om gangen.
ESP32 og FreeRTOS
ESP32-kortet har allerede FreeRTOS firmware installert. FreeRTOS er et open source-sanntidsoperativsystem som er veldig nyttig i multitasking. RTOS hjelper med å administrere ressursene og maksimere systemytelsen. FreeRTOS har mange API-funksjoner for forskjellige formål, og ved hjelp av disse API-ene kan vi opprette oppgaver og få dem til å kjøre på forskjellige kjerner.
Komplett dokumentasjon av FreeRTOS API-er finner du her. Vi vil prøve å bruke noen APIer i koden vår for å bygge et multitasking-program som vil kjøre på begge kjernene.
Finne ESP32 kjerne-ID
Her vil vi bruke Arduino IDE til å laste opp koden til ESP32. For å vite Core ID som koden kjører på, er det en API-funksjon
xPortGetCoreID ()
Denne funksjonen kan kalles fra void setup () og void loop () -funksjonen for å kjenne kjerne-IDen som disse funksjonene kjører på.
Du kan teste dette API-et ved å laste opp skissen nedenfor:
ugyldig oppsett () { Serial.begin (115200); Serial.print ("setup () -funksjon som kjører på kjernen:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () -funksjon som kjører på core:"); Serial.println (xPortGetCoreID ()); }
Etter at du har lastet opp skissen ovenfor, åpner du seriell skjerm, så finner du at begge funksjonene kjører på core1 som vist nedenfor.
Fra observasjonene ovenfor kan det konkluderes med at standard Arduino-skisse alltid kjører på core1.
ESP32 Dual Core-programmering
Arduino IDE støtter FreeRTOS for ESP32 og FreeRTOS APIer lar oss lage oppgaver som kan kjøres uavhengig av begge kjernene. Oppgaven er koden som utfører noen operasjoner på tavlen som blinkende led, sendetemperatur osv.
Funksjonen nedenfor brukes til å lage oppgaver som kan kjøres på begge kjernene. I denne funksjonen må vi gi noen argumenter som en prioritet, kjerne-ID, etc.
Følg trinnene nedenfor for å opprette oppgave- og oppgavefunksjon.
1. Opprett først oppgaver i funksjonen tomromoppsett . Her vil vi lage to oppgaver, en for blinkende LED etter hvert 0,5 sekund, og en annen oppgave er å få temperaturavlesning etter hvert 2. sekund.
xTaskCreatePinnedToCore () -funksjonen tar 7 argumenter:
- Funksjonsnavn for å gjennomføre oppgaven (oppgave1)
- Ethvert navn som er gitt til oppgaven (“task1” osv.)
- Stakkstørrelse tildelt oppgaven i ord (1 ord = 2bytes)
- Oppgaveparameter (kan være NULL)
- Prioritet for oppgaven (0 er den laveste prioriteten)
- Oppgavehåndtak (kan være NULL)
- Kjerne-id der oppgaven skal kjøres (0 eller 1)
Nå skaper TASK1 for blinkende ledet ved å gi alle argumenter i xTaskCreatePinnedToCore () -funksjonen.
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
Likeledes skaper Task2 for Task2 og gjøre kjerne id 1 i 7- th argumentet.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Du kan endre prioritet og stabelstørrelse avhengig av kompleksiteten i oppgaven.
2. Nå skal vi implementere Task1code og Task2code- funksjonen. Disse funksjonene inneholder koden for den nødvendige oppgaven. I vårt tilfelle vil den første oppgaven blinke ledet, og en annen oppgave vil hente temperaturen. Så lag to separate funksjoner for hver oppgave utenfor funksjonen for ugyldig oppsett.
Task1code- funksjon for å blinke ombord-ledet etter 0,5 sekunder er implementert som vist nedenfor.
Void Task1code (void * parameter) { Serial.print ("Task1 running on core"); Serial.println (xPortGetCoreID ()); for (;;) {// uendelig løkke digitalWrite (ledet, HØY); forsinkelse (500); digitalWrite (led, LAV); forsinkelse (500); } }
På samme måte implementerer du Task2code- funksjonen for å hente temperaturen.
ugyldig Task2code (void * pvParameters) { Serial.print ("Task2 running on core"); Serial.println (xPortGetCoreID ()); for (;;) { float t = dht.readTemperature (); Serial.print ("Temperatur:"); Serial.print (t); forsinkelse (2000); } }
3. Her forblir ugyldig sløyfefunksjon tom. Som vi allerede vet at loop- og setup- funksjonen kjører på core1, slik at du også kan implementere core1-oppgave i ugyldig loop- funksjon.
Nå er kodingsdelen over, så det er bare å laste opp koden ved hjelp av Arduino IDE ved å velge ESP32-kortet i Verktøy-menyen. Forsikre deg om at du har koblet DHT11-sensoren til pin D13 på ESP32.
Nå kan resultatene overvåkes på Serial Monitor eller Arduino IDE som vist nedenfor:
Komplekse applikasjoner som sanntidssystem kan bygges ved å kjøre flere oppgaver samtidig ved bruk av doble kjerner i ESP32.
Fullstendig kode sammen med en demo-video er gitt nedenfor.