- Prednosti večjedrnega procesorja
- ESP32 in FreeRTOS
- Iskanje ID-ja jedra ESP32
- Dvojedrno programiranje ESP32
Moduli ESP so priljubljeni zaradi svojih funkcij Wi-Fi, kot so ESP8266, ESP-12E itd. Vsi to so zmogljivi mikrokrmilniški moduli s funkcionalnostmi Wi-Fi. Obstaja še en modul ESP, ki je zmogljivejši in vsestranski od prejšnjih modulov ESP - njegovo ime je ESP32. Ima Bluetooth in Wi-Fi povezljivost in že smo razložili BLE zmogljivosti ESP32 in uporabili ESP32 v številnih IoT projektih. Toda zelo malo ljudi ve, da je ESP32 dvojedrni mikrokrmilnik.
ESP32 ima dva 32-bitna mikroprocesorja Tensilica Xtensa LX6, zaradi česar je močan dvojedrni (core0 in core1) mikrokrmilnik. Na voljo je v dveh različicah enožilni in dvojedrni. Toda dvojedrna različica je bolj priljubljena, ker ni bistvene razlike v ceni.
ESP32 je mogoče programirati z uporabo Arduino IDE, Espressif IDF, Lua RTOS itd. Med programiranjem z Arduino IDE koda deluje samo na Core1, ker je Core0 že programiran za RF komunikacijo. Toda tukaj je ta vadnica, ki bo pokazala, kako uporabiti obe jedri ESP32 za istočasno izvajanje dveh operacij. Tu bo prva naloga utripati vgrajeno LED, druga naloga pa pridobiti podatke o temperaturi s senzorja DHT11.
Najprej si oglejmo prednosti večjedrnega procesorja pred enojedrnim.
Prednosti večjedrnega procesorja
- Večjedrni procesorji so uporabni, če hkrati delujeta več kot 2 procesa.
- Ko se delo porazdeli med različna jedra, se njegova hitrost povečuje in hkrati je mogoče zaključiti več procesov.
- Porabo energije lahko zmanjšamo, ker kadar je katero koli jedro v stanju mirovanja, ga lahko uporabimo za zaustavitev zunanjih naprav, ki takrat niso v uporabi.
- Dvojedrni procesorji morajo preklapljati med različnimi nitmi manj pogosto kot enojedrni procesorji, ker lahko hkrati obdelajo dve namesto ene.
ESP32 in FreeRTOS
Na plošči ESP32 je že nameščena vdelana programska oprema FreeRTOS. FreeRTOS je odprtokodni operacijski sistem v realnem času, ki je zelo uporaben pri večopravilnostih. RTOS pomaga pri upravljanju virov in maksimiranju zmogljivosti sistema. FreeRTOS ima veliko funkcij API za različne namene in z uporabo teh API-jev lahko ustvarjamo naloge in jih izvajamo na različnih jedrih.
Popolno dokumentacijo API-jev FreeRTOS najdete tukaj. Poskusili bomo uporabiti nekaj API-jev v naši kodi za izdelavo večopravilne aplikacije, ki se bo izvajala na obeh jedrih.
Iskanje ID-ja jedra ESP32
Tu bomo uporabili Arduino IDE za nalaganje kode v ESP32. Za poznavanje ID-ja jedra, na katerem se izvaja koda, obstaja funkcija API
xPortGetCoreID ()
To funkcijo lahko pokličete iz funkcije void setup () in void loop (), če želite vedeti ID jedra, na katerem se te funkcije izvajajo.
Ta API lahko preizkusite tako, da naložite spodnjo skico:
void setup () { Serial.begin (115200); Serial.print ("funkcija setup (), ki se izvaja v jedru:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () function running on core:"); Serial.println (xPortGetCoreID ()); }
Po nalaganju zgornje skice odprite serijski monitor in ugotovili boste, da se obe funkciji izvajata na core1, kot je prikazano spodaj.
Iz zgornjih opažanj je mogoče sklepati, da privzeta skica Arduino vedno deluje na jedru1.
Dvojedrno programiranje ESP32
Arduino IDE podpira FreeRTOS za ESP32 in FreeRTOS API-ji omogočajo ustvarjanje nalog, ki se lahko neodvisno izvajajo na obeh jedrih. Naloga je del kode, ki na plošči izvede neko operacijo, na primer utripajoča led, temperatura pošiljanja itd.
Spodnja funkcija se uporablja za ustvarjanje nalog, ki se lahko izvajajo na obeh jedrih. V tej funkciji moramo navesti nekaj argumentov, kot so prednostna naloga, ID jedra itd.
Zdaj sledite spodnjim korakom, da ustvarite opravilo in funkcijo opravila.
1. Najprej ustvarite naloge v funkciji za nastavitev praznine . Tu bomo ustvarili dve nalogi, eno za utripanje LED po vsakih 0,5 sekunde, druga naloga pa je, da dobimo odčitek temperature po vsaki 2 sekundi.
Funkcija xTaskCreatePinnedToCore () ima 7 argumentov:
- Ime funkcije za izvajanje naloge (task1)
- Katero koli ime, dodano nalogi (»task1« itd.)
- Velikost sklada, dodeljena nalogi z besedami (1 beseda = 2 bajta)
- Vhodni parameter opravila (lahko NULL)
- Prednost naloge (0 je najnižja prednost)
- Ročaj opravila (lahko NULL)
- Osnovni ID, kjer se bo izvajala naloga (0 ali 1)
Zdaj ustvarite Task1 za utripanje led, tako da navedete vse argumente v funkciji xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (Task1code, "Task1", 10000, NULL, 1, NULL, 0);
Podobno, ustvariti TASK2 za TASK2 in da jedro id 1 v 7 th argumentov.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Prednost in velikost sklada lahko spremenite glede na zahtevnost naloge.
2. Zdaj bomo implementirali funkcijo Task1code in Task2code . Te funkcije vsebujejo kodo za zahtevano nalogo. V našem primeru bo prva naloga utripala led, druga naloga pa bo dosegla temperaturo. Torej za vsako nalogo izven funkcije nastavitve praznine izdelajte dve ločeni funkciji.
Funkcija Task1code za utripajočo vgrajeno led po 0,5 sekunde je izvedena, kot je prikazano spodaj.
Void Task1code (void * parameter) { Serial.print ("Task1 se izvaja v jedru"); Serial.println (xPortGetCoreID ()); for (;;) {// neskončna zanka digitalWrite (led, HIGH); zamuda (500); digitalWrite (led, LOW); zamudo (500); } }
Podobno izvedite funkcijo Task2code za pridobivanje temperature.
void Task2code (void * pvParameters) { Serial.print ("Task2 teče v jedru"); Serial.println (xPortGetCoreID ()); for (;;) { float t = dht.readTemperature (); Serial.print ("Temperatura:"); Serial.print (t); zamuda (2000); } }
3. Tu bo funkcija void loop ostala prazna. Kot že vemo, da se zanka in nastavitvena funkcija izvajata na core1, tako lahko nalogo core1 izvajate tudi v void loop funkciji.
Zdaj je del kodiranja končan, zato samo naložite kodo z uporabo Arduino IDE, tako da v meniju Orodja izberete ploščo ESP32. Prepričajte se, da ste senzor DHT11 priključili na zatič D13 ESP32.
Zdaj lahko rezultate spremljate na Serial Monitor ali Arduino IDE, kot je prikazano spodaj:
Kompleksne aplikacije, kot je sistem v realnem času, je mogoče zgraditi tako, da hkrati izvajate več nalog z dvojnimi jedri ESP32.
Celotna koda skupaj z predstavitvenim videoposnetkom je navedena spodaj.