- Daugiagyslių procesorių privalumai
- ESP32 ir „FreeRTOS“
- ESP32 pagrindinio ID radimas
- ESP32 dviejų branduolių programavimas
ESP moduliai yra populiarūs dėl savo „Wi-Fi“ funkcijų, tokių kaip ESP8266, ESP-12E ir kt. Visi jie yra galingi mikrovaldiklio moduliai su „Wi-Fi“ funkcijomis. Yra dar vienas ESP modulis, kuris yra galingesnis ir universalesnis nei ankstesni ESP moduliai - jo pavadinimas yra ESP32. Jis turi „Bluetooth“ ir „Wi-Fi“ ryšį, mes jau paaiškinome ESP32 BLE galimybes ir naudojome ESP32 daugelyje IoT projektų. Tačiau labai mažai žmonių žino, kad ESP32 yra dviejų branduolių mikrovaldiklis.
ESP32 turi du 32 bitų „Tensilica Xtensa LX6“ mikroprocesorius, todėl tai yra galingas dviejų branduolių („core0“ ir „core1“) mikrovaldiklis. Jis yra dviejų variantų vieno ir dviejų branduolių variantai. Tačiau dviejų branduolių variantas yra populiaresnis, nes nėra didelio kainų skirtumo.
ESP32 galima užprogramuoti naudojant „Arduino IDE“, „Espressif IDF“, „Lua RTOS“ ir kt. Programuodami su „Arduino IDE“, kodas veikia tik „Core1“, nes „Core0“ jau užprogramuotas radijo ryšiui. Bet čia yra ši pamoka, kurioje parodysime, kaip naudoti abi ESP32 šerdis dviem operacijoms atlikti vienu metu. Pirmoji užduotis bus mirksėti borto šviesos diode, o antroji užduotis bus gauti temperatūros duomenis iš DHT11 jutiklio.
Pirmiausia pažiūrėkime apie kelių branduolių procesoriaus pranašumus prieš vieną branduolį.
Daugiagyslių procesorių privalumai
- Kelių branduolių procesoriai yra naudingi, kai vienu metu veikia daugiau nei 2 procesai.
- Kai darbas pasiskirsto tarp skirtingų branduolių, jo greitis didėja ir vienu metu galima baigti kelis procesus.
- Energijos suvartojimą galima sumažinti, nes kai bet kuris branduolys veikia nenaudojamas, jis gali būti naudojamas tuo metu nenaudojamiems periferiniams įrenginiams išjungti.
- Dviejų branduolių procesoriai turi persijungti tarp skirtingų gijų rečiau nei vieno branduolio procesoriai, nes jie gali tvarkyti du iš karto, o ne po vieną.
ESP32 ir „FreeRTOS“
ESP32 plokštėje jau įdiegta „FreeRTOS“ programinė įranga. „FreeRTOS“ yra atvirojo kodo realaus laiko operacinė sistema, kuri yra labai naudinga atliekant daugelį užduočių. RTOS padeda valdyti išteklius ir maksimaliai padidinti sistemos našumą. „FreeRTOS“ turi daug skirtingų funkcijų skirtingiems tikslams ir, naudodamiesi šiomis API, galime sukurti užduotis ir priversti jas vykdyti skirtinguose branduoliuose.
Išsamią „FreeRTOS“ API dokumentaciją galite rasti čia. Mes bandysime naudoti kai kurias API savo kode, kad sukurtume daugiafunkcinę programą, kuri veiks abiejuose branduoliuose.
ESP32 pagrindinio ID radimas
Čia mes naudosime „Arduino IDE“ kodui įkelti į ESP32. Norint žinoti pagrindinį ID, kuriame veikia kodas, yra API funkcija
„xPortGetCoreID“ ()
Šią funkciją galima iškviesti iš „ void setup“ () ir „ void loop“ (), kad žinotumėte pagrindinį ID, kuriame veikia šios funkcijos.
Galite išbandyti šią API įkeldami toliau pateiktą eskizą:
negaliojanti sąranka () { Serial.begin (115200); Serial.print ("funkcija setup () veikia pagrindiniame:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("funkcija loop (), vykdoma ant branduolio:"); Serial.println (xPortGetCoreID ()); }
Įkėlę aukščiau pateiktą eskizą, atidarykite „Serial“ monitorių ir pamatysite, kad abi funkcijos veikia „core1“, kaip parodyta žemiau.
Iš pirmiau pateiktų pastebėjimų galima daryti išvadą, kad numatytasis „Arduino“ eskizas visada veikia „core1“.
ESP32 dviejų branduolių programavimas
„Arduino IDE“ palaiko „FreeRTOS“, skirtą ESP32, o „FreeRTOS“ API leidžia mums kurti užduotis, kurios gali veikti nepriklausomai abiejuose branduoliuose. Užduotis yra kodo dalis, kuri lentoje atlieka tam tikras operacijas, pvz., Mirksi LED, siunčia temperatūra ir kt.
Ši funkcija naudojama kuriant užduotis, kurios gali būti vykdomos abiejuose branduoliuose. Šioje funkcijoje turime pateikti keletą argumentų, tokių kaip prioritetas, pagrindinis ID ir kt.
Dabar atlikite toliau nurodytus veiksmus, kad sukurtumėte užduotį ir užduoties funkciją.
1. Pirmiausia sukurkite užduotis „ void setup“ funkcijoje. Čia mes sukursime dvi užduotis, vieną mirksintį šviesos diodą kas 0,5 sekundės, o kitą užduotį - kas 2 sekundes parodyti temperatūros rodmenis.
xTaskCreatePinnedToCore () funkcijai reikia 7 argumentų:
- Funkcijos pavadinimas užduočiai įgyvendinti (task1)
- Bet koks užduočiai suteiktas vardas („task1“ ir kt.)
- Krūvos dydis, paskirstytas užduotimi žodžiais (1 žodis = 2 baitai)
- Užduoties įvesties parametras (gali būti NULL)
- Užduoties prioritetas (0 yra žemiausias prioritetas)
- Užduoties rankena (gali būti NULL)
- Pagrindinis ID, kur bus vykdoma užduotis (0 arba 1)
Dabar sukurkite „Task1“, kad mirksėtų lempa, pateikdami visus funkcijos xTaskCreatePinnedToCore () argumentus.
„xTaskCreatePinnedToCore“ („Task1code“, „Task1“, 10000, NULL, 1, NULL, 0);
Panašiai sukurkite „Task2“, skirtą „Task2“, ir 7 -ajame argumente padarykite pagrindinį ID.
„xTaskCreatePinnedToCore“ („Task2code“, „Task2“, 10000, NULL, 1, NULL, 1);
Galite pakeisti prioritetą ir kamino dydį, atsižvelgdami į užduoties sudėtingumą.
2. Dabar įgyvendinsime „ Task1code“ ir „ Task2code“ funkcijas. Šiose funkcijose yra reikalingos užduoties kodas. Mūsų atveju pirmoji užduotis mirksės lempute, o kita užduotis nustatys temperatūrą. Taigi atlikite dvi atskiras kiekvienos užduoties funkcijas už tuščiosios sąrankos funkcijos ribų.
„Task1code“ funkcija, skirta mirksėti borto lemputėje po 0,5 sekundės, įgyvendinama taip, kaip parodyta žemiau.
Panaikinti „Task1code“ (negaliojantis * parametras) { Serial.print („1 užduotis veikia ant šerdies“); Serial.println (xPortGetCoreID ()); for (;;) {// begalinė kilpa digitalWrite (led, HIGH); vėlavimas (500); digitalWrite (LED, žemas); vėlavimą (500); } }
Panašiai įgyvendinkite „ Task2code“ funkciją, kad gautumėte temperatūrą.
void „Task2code“ (void * pvParameters) { Serial.print („2 užduotis veikia ant branduolio“); Serial.println (xPortGetCoreID ()); už (;;) { plūdė t = dht.readTemperature (); Serial.print („Temperatūra:“); Serijinis spaudinys (t); vėlavimas (2000); } }
3. Čia tuštumo ciklo funkcija liks tuščia. Kaip mes jau žinome, kad ciklo ir sąrankos funkcija veikia „core1“, todėl jūs taip pat galite įgyvendinti „core1“ užduotį tuštumos kilpos funkcijoje.
Dabar kodavimo dalis baigėsi, todėl tiesiog įkelkite kodą naudodami „Arduino IDE“, meniu Įrankiai pasirinkę lentą ESP32. Įsitikinkite, kad prijungėte DHT11 jutiklį prie ESP32 D13 kaiščio.
Dabar rezultatus galima stebėti naudojant „Serial Monitor“ arba „Arduino IDE“, kaip parodyta žemiau:
Sudėtingas programas, tokias kaip realaus laiko sistema, galima sukurti vykdant kelias užduotis vienu metu naudojant dvigubus ESP32 branduolius.
Visas kodas kartu su demonstraciniu vaizdo įrašu pateikiamas žemiau.