- Výhody viacjadrového procesora
- ESP32 a FreeRTOS
- Nájdenie ID jadra ESP32
- Dvojjadrové programovanie ESP32
Moduly ESP sú obľúbené pre svoje funkcie Wi-Fi, ako sú ESP8266, ESP-12E atď. Všetko sú to výkonné moduly mikrokontroléra s funkciami Wi-Fi. Existuje ešte jeden modul ESP, ktorý je výkonnejší a všestrannejší ako predchádzajúce moduly ESP - volá sa ESP32. Má pripojenie Bluetooth a Wi-Fi a už sme vysvetlili BLE schopnosti ESP32 a používali ESP32 v mnohých projektoch IoT. Ale len veľmi málo ľudí vie, že ESP32 je dvojjadrový mikrokontrolér.
ESP32 má dva 32-bitové mikroprocesory Tensilica Xtensa LX6, čo z neho robí výkonný dvojjadrový (core0 a core1) mikrokontrolér. Je k dispozícii v dvoch variantoch jednojadrový a dvojjadrový. Ale dvojjadrový variant je populárnejší, pretože tu nie je žiadny výrazný cenový rozdiel.
ESP32 je možné programovať pomocou Arduino IDE, Espressif IDF, Lua RTOS atď. Počas programovania pomocou Arduino IDE beží kód iba na Core1, pretože Core0 je už naprogramovaný na RF komunikáciu. Ale tu je tento návod, ukážeme si, ako používať obe jadrá ESP32 na vykonávanie dvoch operácií súčasne. Tu bude prvou úlohou blikanie palubnej LED a druhou úlohou bude načítanie údajov o teplote zo snímača DHT11.
Poďme sa najskôr pozrieť na výhody viacjadrového procesora oproti jednému jadru.
Výhody viacjadrového procesora
- Viacjadrové procesory sú užitočné, keď súbežne pracujú viac ako 2 procesy.
- Pretože je práca rozdelená medzi rôzne jadrá, zvyšuje sa jej rýchlosť a je možné dokončiť viac procesov súčasne.
- Spotreba energie sa môže znížiť, pretože keď je ľubovoľné jadro v pohotovostnom režime, môže sa použiť na vypnutie periférnych zariadení, ktoré sa v tom čase nepoužívajú.
- Dvojjadrové procesory musia prepínať medzi rôznymi vláknami menej často ako jednojadrové procesory, pretože zvládajú naraz dve namiesto jednej.
ESP32 a FreeRTOS
Na doske ESP32 je už nainštalovaný firmvér FreeRTOS. FreeRTOS je otvorený operačný systém v reálnom čase, ktorý je veľmi užitočný pri multitaskingu. RTOS pomáha pri správe zdrojov a maximalizácii výkonu systému. FreeRTOS má veľa funkcií API na rôzne účely a pomocou týchto API môžeme vytvárať úlohy a nechať ich bežať na rôznych jadrách.
Kompletnú dokumentáciu API FreeRTOS nájdete tu. Pokúsime sa pomocou niektorých rozhraní API v našom kóde vytvoriť multitaskingovú aplikáciu, ktorá bude bežať na oboch jadrách.
Nájdenie ID jadra ESP32
Tu použijeme Arduino IDE na nahranie kódu do ESP32. Aby ste poznali Core ID, na ktorom je spustený kód, existuje funkcia API
xPortGetCoreID ()
Túto funkciu je možné zavolať z funkcií void setup () a void loop (), aby ste zistili ID jadra, na ktorom sú tieto funkcie spustené.
Toto API môžete otestovať nahraním nasledujúceho náčrtu:
void setup () { Serial.begin (115200); Serial.print ("funkcia setup () bežiaca na jadre:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("funkcia loop () bežiaca na jadre:"); Serial.println (xPortGetCoreID ()); }
Po nahraní vyššie uvedeného náčrtu otvorte Sériový monitor a zistíte, že obe funkcie bežia na core1, ako je to znázornené nižšie.
Z vyššie uvedených pozorovaní možno vyvodiť záver, že predvolený náčrt Arduina vždy beží na jadre1.
Dvojjadrové programovanie ESP32
Arduino IDE podporuje FreeRTOS pre ESP32 a FreeRTOS API nám umožňujú vytvárať úlohy, ktoré môžu bežať nezávisle na oboch jadrách. Úlohou je časť kódu, ktorá vykonáva na doske nejaké operácie, ako je blikanie LED, zasielanie teploty atď.
Nasledujúca funkcia sa používa na vytvorenie úloh, ktoré môžu bežať na oboch jadrách. V tejto funkcii musíme uviesť niektoré argumenty ako priorita, id jadra atď.
Teraz postupujte podľa nasledujúcich krokov na vytvorenie úlohy a funkcie úlohy.
1. Najskôr vytvorte úlohy vo funkcii nastavenia neplatnosti . Tu vytvoríme dve úlohy, jednu pre blikanie LED po každých 0,5 sekundách a ďalšou úlohou je načítanie teploty po každých 2 sekundách.
Funkcia xTaskCreatePinnedToCore () vyžaduje 7 argumentov:
- Názov funkcie na implementáciu úlohy (task1)
- Ľubovoľný názov úlohy („task1“ atď.)
- Veľkosť stohu pridelená úlohe slovami (1 slovo = 2 bajty)
- Vstupný parameter úlohy (môže mať hodnotu NULL)
- Priorita úlohy (0 je najnižšia priorita)
- Rukoväť úlohy (môže mať NULL)
- ID jadra, kde bude úloha spustená (0 alebo 1)
Teraz vytvorte Task1 pre blikanie led zadaním všetkých argumentov vo funkcii xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (Task1code, "Task1", 10 000, NULL, 1, NULL, 0);
Podobne, vytvoriť TASK2 pre TASK2 a aby jadro id 1 v 7 th argumentu.
xTaskCreatePinnedToCore (Task2code, "Task2", 10 000, NULL, 1, NULL, 1);
V závislosti od zložitosti úlohy môžete zmeniť prioritu a veľkosť zásobníka.
2. Teraz implementujeme funkciu Task1code a Task2code . Tieto funkcie obsahujú kód požadovanej úlohy. V našom prípade bude prvá úloha blikať LED a ďalšia úloha zvýši teplotu. Takže pre každú úlohu mimo funkcie nastavenia neplatnosti vytvorte dve samostatné funkcie.
Funkcia Task1code pre blikanie palubnej LED po 0,5 sekundách je implementovaná, ako je uvedené nižšie.
Void Task1code (void * parameter) { Serial.print ("Task1 running on core"); Serial.println (xPortGetCoreID ()); for (;;) {// nekonečná slučka digitalWrite (led, HIGH); oneskorenie (500); digitalWrite (ľad, LOW), oneskorenie (500); } }
Podobne implementujte funkciu Task2code na načítanie teploty.
void Task2code (void * pvParameters) { Serial.print ("Task2 beží na jadre"); Serial.println (xPortGetCoreID ()); pre (;;) { float t = dht.readTemperature (); Serial.print ("Teplota:"); Sériová tlač (t); meškanie (2000); } }
3. Tu funkcia prázdnej slučky zostane prázdna. Ako už vieme, funkcia slučky a nastavenia beží na core1, takže môžete implementovať úlohu core1 aj vo funkcii void loop .
Teraz je koniec s časťou na kódovanie, takže stačí nahrať kód pomocou Arduino IDE výberom dosky ESP32 v ponuke Nástroje. Uistite sa, že ste pripojili snímač DHT11 k pólu D13 na ESP32.
Teraz je možné výsledky sledovať na Serial Monitor alebo Arduino IDE, ako je uvedené nižšie:
Komplexné aplikácie, ako je systém v reálnom čase, je možné vytvoriť súčasným spustením viacerých úloh pomocou dvojitých jadier ESP32.
Kompletný kód spolu s ukážkovým videom je uvedený nižšie.