- Moniytimisen prosessorin edut
- ESP32 ja FreeRTOS
- ESP32-ydintunnuksen etsiminen
- ESP32 Dual Core -ohjelmointi
ESP-moduulit ovat suosittuja Wi-Fi-toimintojensa, kuten ESP8266, ESP-12E, jne. Vuoksi. Nämä kaikki ovat tehokkaita mikrokontrollerimoduuleja, joissa on Wi-Fi-toiminnot. On vielä yksi ESP-moduuli, joka on tehokkaampi ja monipuolisempi kuin aiemmat ESP- moduulit - sen nimi on ESP32. Siinä on Bluetooth- ja Wi-Fi-yhteys, ja olemme jo selittäneet ESP32: n BLE-ominaisuuksia ja käyttäneet ESP32: ta monissa IoT-projekteissa. Mutta hyvin harvat ihmiset tietävät, että ESP32 on kaksiytiminen mikrokontrolleri.
ESP32: ssa on kaksi 32-bittistä Tensilica Xtensa LX6 -prosessoria, mikä tekee siitä tehokkaan kaksiytimisen (core0 ja core1) mikrokontrollerin. Sitä on saatavana kahtena vaihtoehtona yksiytiminen ja kaksiytiminen. Mutta kaksiytiminen variantti on suositumpi, koska merkittävää hintaeroa ei ole.
ESP32 voidaan ohjelmoida käyttämällä Arduino IDE: tä, Espressif IDF: ää, Lua RTOS: ta jne. Kun ohjelmoidaan Arduino IDE: llä, koodi toimii vain Core1: llä, koska Core0 on jo ohjelmoitu radiotaajuutta varten. Mutta tässä tässä opetusohjelmassa näytämme, kuinka ESP32: n molempia ytimiä käytetään kahden toiminnon suorittamiseen samanaikaisesti. Ensimmäisenä tehtävänä on vilkkua ajoneuvon LED-valoa ja toisena tehtävänä on noutaa lämpötilatiedot DHT11-anturista.
Katsotaan ensin moniytimisen prosessorin edut yhteen ytimeen nähden.
Moniytimisen prosessorin edut
- Moniytimiset prosessorit ovat hyödyllisiä, kun samanaikaisesti toimii enemmän kuin 2 prosessia.
- Kun työ jakautuu eri ytimien kesken, sen nopeus kasvaa ja useita prosesseja voidaan suorittaa loppuun samanaikaisesti.
- Virrankulutusta voidaan vähentää, koska millä tahansa ytimellä on lepotilassa, sitä voidaan käyttää samaan aikaan käyttämättömien oheislaitteiden sammuttamiseen.
- Kahden ytimen suorittimien on vaihdettava eri ketjujen välillä harvemmin kuin yksiytimiset prosessorit, koska ne pystyvät käsittelemään kahta kerrallaan yhden sijasta kerrallaan.
ESP32 ja FreeRTOS
ESP32-kortissa on jo asennettuna FreeRTOS-laiteohjelmisto. FreeRTOS on avoimen lähdekoodin reaaliaikainen käyttöjärjestelmä, joka on erittäin hyödyllinen moniajoissa. RTOS auttaa resurssien hallinnassa ja järjestelmän suorituskyvyn maksimoinnissa. FreeRTOS: lla on monia API-toimintoja eri tarkoituksiin, ja näiden API: iden avulla voimme luoda tehtäviä ja saada ne toimimaan eri ytimissä.
FreeRTOS-sovellusliittymien täydellinen dokumentaatio löytyy täältä. Yritämme käyttää joitain sovellusliittymiä koodissamme monitoimisovelluksen rakentamiseen, joka toimii molemmissa ytimissä.
ESP32-ydintunnuksen etsiminen
Tässä käytämme koodia ESP32: een Arduino IDE: n avulla. API-toiminto on tiedettävä ydintunnus, jolla koodi toimii
xPortGetCoreID ()
Tätä toimintoa voidaan kutsua void setup () - ja void loop () -toiminnoista, jotta tiedetään ydintunnus, jolla nämä toiminnot ovat käynnissä.
Voit testata tätä sovellusliittymää lataamalla alla olevan luonnoksen:
void setup () { Sarja.alku (115200); Serial.print ("setup () -toiminto käynnissä ytimessä:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("loop () -funktio käynnissä ytimessä:"); Serial.println (xPortGetCoreID ()); }
Kun olet ladannut yllä olevan luonnoksen, avaa sarjamonitori ja huomaat, että molemmat toiminnot ovat käynnissä ytimessä1, kuten alla on esitetty.
Edellä olevista havainnoista voidaan päätellä, että Arduino-oletusluonnos toimii aina core1: llä.
ESP32 Dual Core -ohjelmointi
Arduino IDE tukee FreeRTOSia ESP32: lle ja FreeRTOS-sovellusliittymien avulla voimme luoda tehtäviä, jotka voivat toimia itsenäisesti molemmissa ytimissä. Tehtävä on koodikappale, joka suorittaa jonkin toiminnon taululla, kuten vilkkuva led, lähetyslämpötila jne.
Alla olevaa toimintoa käytetään luomaan tehtäviä, jotka voivat toimia molemmissa ytimissä. Tässä toiminnossa meidän on annettava joitain argumentteja, kuten prioriteetti, ydintunnus jne.
Seuraa nyt alla olevia ohjeita luodaksesi tehtävän ja tehtävän.
1. Luo ensin tehtävät void setup -toiminnossa. Tässä luodaan kaksi tehtävää, yksi LED-merkkivalon vilkkumiselle 0,5 sekunnin välein ja toinen tehtävä on saada lämpötilalukema 2 sekunnin välein.
xTaskCreatePinnedToCore () -funktiossa on 7 argumenttia:
- Funktion nimi tehtävän toteuttamiseksi (task1)
- Mikä tahansa tehtävälle annettu nimi ("task1" jne.)
- Tehtävälle varattu pinon koko sanoin (1 sana = 2 tavua)
- Tehtävän syöttöparametri (voi olla NULL)
- Tehtävän prioriteetti (0 on alin prioriteetti)
- Tehtävän kahva (voi olla NULL)
- Ydintunnus, jossa tehtävä suoritetaan (0 tai 1)
Luo nyt Tehtävä1 ledin vilkkumiseksi antamalla kaikki argumentit xTaskCreatePinnedToCore () -funktiossa.
xTaskCreatePinnedToCore (Tehtävä1koodi, "Tehtävä1", 10000, NULL, 1, NULL, 0);
Vastaavasti, luoda Task2 varten Task2 ja tehdä ytimen id 1 7 th argumentti.
xTaskCreatePinnedToCore (Tehtävä2koodi, "Tehtävä2", 10000, NULL, 1, NULL, 1);
Voit muuttaa prioriteettia ja pinon kokoa tehtävän monimutkaisuuden mukaan.
2. Nyt toteutamme Task1code- ja Task2code- toiminnot. Nämä toiminnot sisältävät vaaditun tehtävän koodin. Meidän tapauksessamme ensimmäinen tehtävä vilkkuu lediä ja toinen tehtävä noutaa lämpötilan. Joten tee kaksi erillistä toimintoa jokaiselle tehtävälle tyhjät asetustoiminnon ulkopuolella.
Task1code- toiminto , joka vilkkuu sisäisellä ledillä 0,5 sekunnin kuluttua, on toteutettu alla olevan kuvan mukaisesti.
Tyhjennä Tehtävä1koodi (void * -parametri) { Serial.print ("Tehtävä1 toimii ytimessä"); Serial.println (xPortGetCoreID ()); for (;;) {// ääretön silmukka digitalWrite (led, HIGH); viive (500); digitalWrite (led, LOW), viiveen (500); } }
Vastaavasti toteutetaan Task2code- toiminto lämpötilan noutamiseksi.
void Task2code (void * pvParameters) { Serial.print ("Tehtävä 2 käynnissä ytimessä"); Serial.println (xPortGetCoreID ()); for (;;) { float t = dht. lukulämpötila (); Serial.print ("Lämpötila:"); Sarjaprintti (t); viive (2000); } }
3. Tyhjä silmukka -toiminto jää tyhjäksi. Kuten jo tiedämme, että silmukka- ja asetustoiminto toimii core1: llä, joten voit toteuttaa core1-tehtävän myös tyhjässä silmukkatoiminnossa .
Nyt koodausosa on ohi, joten lataa koodi vain Arduino IDE: n avulla valitsemalla ESP32-kortti Työkalut-valikosta. Varmista, että olet liittänyt DHT11-anturin ESP32: n tapaan D13.
Nyt tuloksia voidaan seurata Serial Monitorilla tai Arduino IDE: llä alla esitetyllä tavalla:
Monimutkaiset sovellukset, kuten reaaliaikainen järjestelmä, voidaan rakentaa suorittamalla useita tehtäviä samanaikaisesti ESP32: n kaksoisydinten avulla.
Täydellinen koodi sekä esittelyvideo on annettu alla.