- A többmagos processzor előnyei
- ESP32 és FreeRTOS
- Az ESP32 core ID megkeresése
- ESP32 kétmagos programozás
Az ESP modulok népszerűek olyan Wi-Fi funkciók miatt, mint az ESP8266, ESP-12E stb. Ezek mind erőteljes mikrokontroller modulok Wi-Fi funkciókkal. Van még egy ESP modul, amely erősebb és sokoldalúbb, mint a korábbi ESP modulok - neve ESP32. Bluetooth és Wi-Fi kapcsolattal rendelkezik, és már elmagyaráztuk az ESP32 BLE képességeit, és számos IoT projektben használtuk az ESP32-et. De nagyon kevesen tudják, hogy az ESP32 kétmagos mikrovezérlő.
Az ESP32 két 32 bites Tensilica Xtensa LX6 mikroprocesszorral rendelkezik, ami erőteljes kétmagos (core0 és core1) mikrokontrollerré teszi. Kétféle változatban kapható egy- és kétmagos. De a kétmagos változat népszerűbb, mert nincs jelentős árkülönbség.
Az ESP32 programozható Arduino IDE, Espressif IDF, Lua RTOS stb. Használatával. Az Arduino IDE programozásakor a kód csak a Core1-en fut, mert a Core0 már be van programozva RF kommunikációra. De itt van ez az oktatóanyag, amely megmutatja, hogyan használhatjuk az ESP32 mindkét magját két művelet egyidejű végrehajtására. Itt az első feladat a fedélzeti LED villogása, a második feladat a hőmérsékleti adatok lehívása a DHT11 érzékelőből.
Először nézzük meg a többmagos processzor előnyeit egyetlen maggal szemben.
A többmagos processzor előnyei
- A többmagos processzorok akkor hasznosak, ha kettőnél több folyamat működik egyszerre.
- Mivel a munka különböző magok között oszlik meg, annak sebessége növekszik, és több folyamat egyszerre befejezhető.
- Az energiafogyasztás csökkenthető, mert ha bármely mag készenléti üzemmódban van, akkor fel lehet használni az akkor még nem használt perifériák leállítására.
- A kétmagos processzoroknak ritkábban kell váltaniuk a különböző szálak között, mint az egymagos processzorok, mert egyszerre kettőt tudnak kezelni, nem pedig egyet.
ESP32 és FreeRTOS
Az ESP32 táblára már telepítve van a FreeRTOS firmware. A FreeRTOS egy nyílt forráskódú, valós idejű operációs rendszer, amely nagyon hasznos a multitaskingban. Az RTOS segít az erőforrások kezelésében és a rendszer teljesítményének maximalizálásában. A FreeRTOS-nak számos API-funkciója van, különböző célokra, és ezen API-k használatával feladatokat hozhatunk létre, és különböző magokon futtathatjuk őket.
A FreeRTOS API-k teljes dokumentációja itt található. Megpróbálunk néhány API-t használni a kódunkban egy olyan többfeladatos alkalmazás létrehozásához, amely mindkét magon futni fog.
Az ESP32 core ID megkeresése
Itt az Arduino IDE segítségével fogjuk feltölteni a kódot az ESP32-be. Az alapvető azonosító ismeretéhez, amelyen a kód fut, létezik API-függvény
xPortGetCoreID ()
Ez a funkció meghívható a void setup () és a void loop () függvényekből, hogy megismerje a magazonosítót, amelyen ezek a funkciók futnak.
Az alábbi vázlat feltöltésével tesztelheti ezt az API-t:
void setup () { Soros.kezdés (115200); Serial.print ("magon futó setup () függvény:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("a magon futó loop () függvény:"); Serial.println (xPortGetCoreID ()); }
A fenti vázlat feltöltése után nyissa meg a soros monitort, és azt fogja tapasztalni, hogy mindkét funkció fut a core1-en, az alábbiak szerint.
A fenti megfigyelésekből arra lehet következtetni, hogy az alapértelmezett Arduino vázlat mindig a core1-en fut.
ESP32 kétmagos programozás
Az Arduino IDE támogatja a FreeRTOS for ESP32 alkalmazást, és a FreeRTOS API-k lehetővé teszik számunkra, hogy olyan feladatokat hozzunk létre, amelyek függetlenül futhatnak mindkét magon. A feladat az a kódrészlet, amely valamilyen műveletet végez a táblán, például villogó led, küldési hőmérséklet stb.
Az alábbi függvény olyan feladatok létrehozására szolgál, amelyek mindkét magon futtathatóak. Ebben a függvényben meg kell adnunk néhány argumentumot, például prioritást, alap azonosítót stb.
Most kövesse az alábbi lépéseket a feladat és a feladatfunkció létrehozásához.
1. Először hozzon létre feladatokat a void setup funkcióban. Itt két feladatot hozunk létre, az egyiket a LED villogására 0,5 másodpercenként, a másik feladat pedig a hőmérséklet-leolvasás 2 másodpercenként történő megadása.
Az xTaskCreatePinnedToCore () függvény 7 argumentumot tartalmaz:
- Funkció neve a feladat végrehajtásához (task1)
- A feladatnak adott bármilyen név („task1” stb.)
- A feladatra szánt veremméret szavakkal (1 szó = 2 bájt)
- Feladat bemeneti paraméter (lehet NULL)
- A feladat prioritása (0 a legalacsonyabb prioritás)
- Feladat fogantyú (lehet NULL)
- Core azonosító, ahol a feladat futni fog (0 vagy 1)
Most hozza létre a Task1-et a led villogásához az összes argumentum megadásával az xTaskCreatePinnedToCore () függvényben.
xTaskCreatePinnedToCore (Feladatkód, "Feladat1", 10000, NULL, 1, NULL, 0);
Hasonlóképpen, hozzon létre TASK2 számára TASK2, és magot id 1 a 7 -én érv.
xTaskCreatePinnedToCore (Feladatkód, "Feladat2", 10000, NULL, 1, NULL, 1);
A prioritás és a verem méretét a feladat összetettségétől függően módosíthatja.
2. Most megvalósítjuk a Task1code és a Task2code függvényeket. Ezek a függvények tartalmazzák a szükséges feladat kódját. Esetünkben az első feladat villog a leden, és egy másik feladat megkapja a hőmérsékletet. Tehát minden egyes feladathoz hozzon létre két külön funkciót a void setup függvényen kívül.
A Task1code funkció a fedélzeti led villogásához 0,5 másodperc múlva valósul meg az alábbiak szerint.
Érvénytelen a Task1code (void * paraméter) { Serial.print ("1. feladat a magon fut"); Serial.println (xPortGetCoreID ()); for (;;) {// végtelen hurok digitalWrite (led, HIGH); késés (500); digitalWrite (led, LOW); késleltetés (500); } }
Ehhez hasonlóan hajtsa végre a Task2code függvényt a hőmérséklet beolvasásához.
void Task2code (void * pvParameters) { Serial.print ("A magon futó 2. feladat"); Serial.println (xPortGetCoreID ()); for (;;) { float t = dht.readTemperature (); Serial.print ("Hőmérséklet:"); Soros nyomtatás (t); késés (2000); } }
3. Itt a void loop funkció üres marad. Amint már tudjuk, hogy a ciklus és a beállítási funkció a core1-en fut, így a core1 feladatot a void loop funkcióban is megvalósíthatja.
Most a kódolási résznek vége, ezért csak töltse fel a kódot az Arduino IDE segítségével az ESP32 kártya kiválasztásával az Eszközök menüben. Győződjön meg arról, hogy a DHT11 érzékelőt csatlakoztatta az ESP32 D13 tűjéhez.
Az eredmények az alábbiak szerint követhetők a Serial Monitor vagy az Arduino IDE segítségével:
Olyan összetett alkalmazásokat, mint a valós idejű rendszer, több feladat egyidejű futtatásával lehet felépíteni az ESP32 kettős magjával.
A teljes kódot és a bemutató videót az alábbiakban adjuk meg.