- Prednosti višejezgrenog procesora
- ESP32 i FreeRTOS
- Pronalaženje ID-a jezgre ESP32
- Dvojezgreno programiranje ESP32
ESP moduli su popularni zbog svojih Wi-Fi funkcionalnosti poput ESP8266, ESP-12E, itd. Sve su to moćni mikrokontroleri s Wi-Fi funkcionalnostima. Postoji još jedan ESP modul koji je moćniji i svestraniji od prethodnih ESP modula - njegovo ime je ESP32. Ima Bluetooth i Wi-Fi vezu, a mi smo već objasnili BLE mogućnosti ESP32 i koristili ESP32 u mnogim IoT projektima. Ali vrlo malo ljudi zna da je ESP32 dvojezgreni mikrokontroler.
ESP32 ima dva 32-bitna Tensilica Xtensa LX6 mikroprocesora što ga čini moćnim dvojezgrenim (core0 i core1) mikrokontrolerom. Dostupan je u dvije varijante jednojezgrene i dvojezgrene jezgre. No, dual-core varijanta popularnija je jer nema značajne razlike u cijeni.

ESP32 se može programirati pomoću Arduino IDE, Espressif IDF, Lua RTOS, itd. Tijekom programiranja s Arduino IDE, kôd radi samo na Core1 jer je Core0 već programiran za RF komunikaciju. Ali evo ovog vodiča, pokazat ćemo kako koristiti obje jezgre ESP32 za istovremeno izvršavanje dviju operacija. Ovdje će prvi zadatak biti treptanje ugrađene LED diode, a drugi zadatak dohvaćanja podataka o temperaturi s DHT11 senzora.
Pogledajmo prvo prednosti višejezgrenog procesora u odnosu na jednojezgreni.
Prednosti višejezgrenog procesora
- Višejezgreni procesori korisni su kada istovremeno rade više od 2 procesa.
- Kako se rad raspoređuje među različite jezgre, povećava se njegova brzina i istovremeno se mogu dovršiti više procesa.
- Potrošnja energije može se smanjiti, jer kada je bilo koja jezgra u stanju mirovanja, može se koristiti za isključivanje perifernih uređaja koji se u tom trenutku ne koriste.
- Dvojezgreni procesori moraju se rjeđe prebacivati s različitih niti na jednojezgrene procesore, jer mogu istovremeno rukovati s dvije, umjesto s jednom.
ESP32 i FreeRTOS
Na ploči ESP32 već je instaliran firmware FreeRTOS. FreeRTOS je operativni sustav u stvarnom vremenu otvorenog koda koji je vrlo koristan u multitaskingu. RTOS pomaže u upravljanju resursima i maksimiziranju performansi sustava. FreeRTOS ima mnogo API funkcija za različite svrhe i pomoću tih API-ja možemo stvarati zadatke i pokretati ih na različitim jezgrama.
Kompletnu dokumentaciju FreeRTOS API-ja možete pronaći ovdje. Pokušat ćemo upotrijebiti neke API-je u našem kodu za izgradnju multitasking aplikacije koja će se izvoditi na obje jezgre.
Pronalaženje ID-a jezgre ESP32
Ovdje ćemo koristiti Arduino IDE za prijenos koda u ESP32. Postoji API funkcija da biste znali Core ID na kojem se kôd izvodi
xPortGetCoreID ()
Ova se funkcija može pozvati iz funkcije void setup () i void loop () kako bi se znalo ID jezgre na kojem se te funkcije izvode.
Možete testirati ovaj API prijenosom donje skice:
void setup () { Serial.begin (115200); Serial.print ("funkcija setup () koja radi na jezgri:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () funkcija koja se izvodi na jezgri:"); Serial.println (xPortGetCoreID ()); }
Nakon što prenesete gornju skicu, otvorite serijski monitor i vidjet ćete da se obje funkcije izvode na core1 kao što je prikazano dolje.

Iz gornjih zapažanja može se zaključiti da zadana Arduino skica uvijek radi na jezgri1.
Dvojezgreno programiranje ESP32
Arduino IDE podržava FreeRTOS za ESP32, a FreeRTOS API-ji omogućuju nam stvaranje zadataka koji se mogu samostalno izvoditi na obje jezgre. Zadatak je dio koda koji izvodi neke operacije na ploči poput treptanja vodilice, temperature slanja itd.
Funkcija u nastavku koristi se za stvaranje zadataka koji se mogu izvoditi na obje jezgre. U ovoj funkciji moramo dati neke argumente poput prioriteta, ID-a jezgre itd.
Sada slijedite korake u nastavku za stvaranje zadatka i funkcije zadatka.
1. Prvo stvorite zadatke u funkciji postavljanja praznina . Ovdje ćemo stvoriti dva zadatka, jedan za treptanje LED diode nakon svakih 0,5 sekundi, a drugi zadatak je očitavanje temperature nakon svake 2 sekunde.
xTaskCreatePinnedToCore () funkcija uzima 7 argumenata:
- Naziv funkcije za provedbu zadatka (task1)
- Bilo koje ime dodijeljeno zadatku ("zadatak1", itd.)
- Veličina sloga dodijeljena zadatku riječima (1 riječ = 2 bajta)
- Ulazni parametar zadatka (može biti NULL)
- Prioritet zadatka (0 je najniži prioritet)
- Ručka zadatka (može biti NULL)
- Jezgro jezgre na kojem će se izvršiti zadatak (0 ili 1)
Sada stvorite Task1 za treptanje vodiča davanjem svih argumenata u funkciji xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
Slično tome, stvoriti TASK2 za TASK2 i napraviti osnovnu id 1 u 7 -og argument.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Možete promijeniti prioritet i veličinu hrpe ovisno o složenosti zadatka.
2. Sada ćemo implementirati Task1code i Task2code funkciju. Te funkcije sadrže kôd potrebnog zadatka. U našem slučaju, prvi zadatak će treptati led, a drugi će zadati temperaturu. Dakle, napravite dvije odvojene funkcije za svaki zadatak izvan funkcije postavljanja praznina.
Funkcija Task1code za treptanje na ploči nakon 0,5 sekundi implementirana je kao što je prikazano u nastavku.
Void Task1code (void * parametar) { Serial.print ("Task1 pokrenut na jezgri"); Serial.println (xPortGetCoreID ()); for (;;) {// beskonačna petlja digitalWrite (led, HIGH); kašnjenje (500); digitalWrite (vodio, PO) kašnjenje (500); } }
Slično tome, implementirajte Task2code funkciju za dohvaćanje temperature.
void Task2code (void * pvParameters) { Serial.print ("Task2 pokrenut na jezgri"); Serial.println (xPortGetCoreID ()); for (;;) { float t = dht.readTemperature (); Serial.print ("Temperatura:"); Serial.print (t); kašnjenje (2000); } }
3. Ovdje će void loop funkcija ostati prazna. Kao što već znamo da se petlja i funkcija postavljanja izvršavaju na core1, tako da možete implementirati zadatak core1 i u void loop funkciju.
Sad je dio kodiranja gotov, pa jednostavno prenesite kôd pomoću Arduino IDE-a odabirom ploče ESP32 u izborniku Alati. Obavezno spojite DHT11 senzor na pin D13 ESP32.

Sada se rezultati mogu pratiti na Serial Monitor ili Arduino IDE, kao što je prikazano dolje:

Složene aplikacije poput sustava u stvarnom vremenu mogu se graditi istodobno izvođenjem više zadataka pomoću dvostrukih jezgri ESP32.
Kompletni kôd zajedno s demo videozapisom naveden je u nastavku.
