- Výhody vícejádrového procesoru
- ESP32 a FreeRTOS
- Nalezení ID jádra ESP32
- Dvoujádrové programování ESP32
Moduly ESP jsou oblíbené pro své funkce Wi-Fi, jako jsou ESP8266, ESP-12E atd. Jedná se o výkonné moduly mikrokontroléru s funkcemi Wi-Fi. Existuje ještě jeden modul ESP, který je výkonnější a univerzálnější než předchozí moduly ESP - jeho název je ESP32. Má připojení Bluetooth a Wi-Fi a již jsme vysvětlili možnosti BLE ESP32 a používali ESP32 v mnoha projektech IoT. Ale jen velmi málo lidí ví, že ESP32 je dvoujádrový mikrokontrolér.
ESP32 má dva 32bitové mikroprocesory Tensilica Xtensa LX6, což z něj činí výkonný dvoujádrový mikrokontrolér (core0 a core1). Je k dispozici ve dvou variantách, jednojádrový a dvoujádrový. Dvoujádrová varianta je ale populárnější, protože zde není žádný podstatný cenový rozdíl.
ESP32 lze programovat pomocí Arduino IDE, Espressif IDF, Lua RTOS atd. Při programování pomocí Arduino IDE běží kód pouze na Core1, protože Core0 je již naprogramován pro RF komunikaci. Ale tady je tento tutoriál, ukážeme si, jak používat obě jádra ESP32 k provádění dvou operací současně. Zde bude prvním úkolem blikat palubní LED a druhým úkolem bude načíst teplotní data ze snímače DHT11.
Nejprve se podívejme na výhody vícejádrového procesoru oproti jednomu jádru.
Výhody vícejádrového procesoru
- Vícejádrové procesory jsou užitečné, pokud existují více než 2 procesy, které pracují současně.
- Vzhledem k tomu, že práce je rozdělena mezi různá jádra, zvyšuje se její rychlost a lze dokončit více procesů najednou.
- Spotřebu energie lze snížit, protože když je jakékoli jádro v klidovém režimu, lze jej použít k vypnutí periferních zařízení, která se v té době nepoužívají.
- Dvoujádrové procesory musí přepínat mezi různými vlákny méně často než jednojádrové procesory, protože mohou zpracovávat dva najednou místo jednoho po druhém.
ESP32 a FreeRTOS
Na desce ESP32 je již nainstalován firmware FreeRTOS. FreeRTOS je otevřený operační systém v reálném čase, který je velmi užitečný při multitaskingu. RTOS pomáhá při správě zdrojů a maximalizaci výkonu systému. FreeRTOS má mnoho funkcí API pro různé účely a pomocí těchto API můžeme vytvářet úkoly a nechat je běžet na různých jádrech.
Kompletní dokumentaci API FreeRTOS najdete zde. Pokusíme se použít některá rozhraní API v našem kódu k vytvoření multitaskingové aplikace, která bude fungovat na obou jádrech.
Nalezení ID jádra ESP32
Zde použijeme Arduino IDE k nahrání kódu do ESP32. Chcete-li znát ID jádra, na kterém je spuštěn kód, existuje funkce API
xPortGetCoreID ()
Tuto funkci lze volat z funkcí void setup () a void loop (), aby bylo možné znát ID jádra, na kterém tyto funkce běží.
Toto API můžete otestovat nahráním níže uvedené skici:
void setup () { Serial.begin (115200); Serial.print ("funkce setup () běžící na jádru:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () funkce běžící na jádru:"); Serial.println (xPortGetCoreID ()); }
Po nahrání výše uvedené skici otevřete Serial monitor a zjistíte, že obě funkce běží na core1, jak je znázorněno níže.
Z výše uvedených pozorování lze vyvodit závěr, že výchozí skica Arduina vždy běží na core1.
Dvoujádrové programování ESP32
Arduino IDE podporuje FreeRTOS pro ESP32 a FreeRTOS API nám umožňují vytvářet úkoly, které mohou běžet nezávisle na obou jádrech. Úkolem je část kódu, která na desce provádí nějakou operaci, jako je blikání LED, odesílání teploty atd.
Níže uvedená funkce se používá k vytváření úkolů, které lze spustit na obou jádrech. V této funkci musíme uvést některé argumenty, jako je priorita, id jádra atd.
Nyní vytvořte úkol a funkci úkolu podle níže uvedených kroků.
1. Nejprve vytvořte úkoly ve funkci nastavení neplatnosti . Zde vytvoříme dva úkoly, jeden pro blikání LED po každých 0,5 sekundách a další úkol je odečítání teploty po každých 2 sekundách.
Funkce xTaskCreatePinnedToCore () vyžaduje 7 argumentů:
- Název funkce k implementaci úkolu (task1)
- Libovolný název úkolu („task1“ atd.)
- Velikost zásobníku přidělená úkolu slovy (1 slovo = 2 bajty)
- Vstupní parametr úlohy (může mít hodnotu NULL)
- Priorita úkolu (0 je nejnižší priorita)
- Popisovač úlohy (může mít hodnotu NULL)
- ID jádra, kde bude úkol spuštěn (0 nebo 1)
Nyní vytvořte Task1 pro blikání LED zadáním všech argumentů ve funkci xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (Task1code, "Task1", 10 000, NULL, 1, NULL, 0);
Podobně, vytvořit TASK2 pro TASK2 a aby jádro id 1 v 7 th argumentu.
xTaskCreatePinnedToCore (Task2code, "Task2", 10 000, NULL, 1, NULL, 1);
V závislosti na složitosti úkolu můžete změnit prioritu a velikost zásobníku.
2. Nyní implementujeme funkci Task1code a Task2code . Tyto funkce obsahují kód požadované úlohy. V našem případě bude první úkol blikat LED a další úkol načte teplotu. Takže pro každou úlohu mimo funkci nastavení neplatnosti vytvořte dvě samostatné funkce.
Je implementována funkce Task1code pro blikání LED na palubě po 0,5 sekundách, jak je uvedeno níže.
Void Task1code (void * parameter) { Serial.print ("Task1 running on core"); Serial.println (xPortGetCoreID ()); for (;;) {// nekonečná smyčka digitalWrite (led, HIGH); zpoždění (500); digitalWrite (led, LOW), zpoždění (500); } }
Podobně implementujte funkci Task2code pro načítání teploty.
void Task2code (void * pvParameters) { Serial.print ("Task2 běží na jádru"); Serial.println (xPortGetCoreID ()); for (;;) { float t = dht.readTemperature (); Serial.print ("Teplota:"); Serial.print (t); zpoždění (2000); } }
3. Zde funkce prázdné smyčky zůstane prázdná. Jak již víme, tato funkce smyčky a nastavení běží na core1, takže můžete implementovat úlohu core1 také ve funkci void loop .
Nyní je kódovací část u konce, takže stačí nahrát kód pomocí Arduino IDE výběrem desky ESP32 v nabídce Nástroje. Ujistěte se, že jste připojili snímač DHT11 ke kolíku D13 ESP32.
Výsledky lze nyní sledovat na Serial Monitor nebo Arduino IDE, jak je uvedeno níže:
Složité aplikace, jako je systém v reálném čase, lze vytvořit současným spuštěním více úkolů pomocí duálních jader ESP32.
Kompletní kód spolu s ukázkovým videem je uveden níže.