- Daudzkodolu procesora priekšrocības
- ESP32 un FreeRTOS
- ESP32 koda ID atrašana
- ESP32 divkodolu programmēšana
ESP moduļi ir populāri ar savām Wi-Fi funkcionalitātēm, piemēram, ESP8266, ESP-12E utt. Visi šie ir jaudīgi mikrokontrolleru moduļi ar Wi-Fi funkcionalitāti. Ir vēl viens ESP modulis, kas ir jaudīgāks un daudzpusīgāks nekā iepriekšējie ESP moduļi - tā nosaukums ir ESP32. Tam ir Bluetooth un Wi-Fi savienojamība, un mēs jau izskaidrojām ESP32 BLE iespējas un izmantojām ESP32 daudzos IoT projektos. Bet ļoti maz cilvēku zina, ka ESP32 ir divkodolu mikrokontrolleris.
ESP32 ir divi 32 bitu Tensilica Xtensa LX6 mikroprocesori, kas padara to par spēcīgu divkodolu (core0 un core1) mikrokontrolleru. Tas ir pieejams divos variantos ar vienkodolu un divkodolu. Bet divkodolu variants ir populārāks, jo nav būtiskas cenu atšķirības.
ESP32 var ieprogrammēt, izmantojot Arduino IDE, Espressif IDF, Lua RTOS utt. Programmējot ar Arduino IDE, kods darbojas tikai uz Core1, jo Core0 jau ir ieprogrammēts RF sakariem. Bet šeit ir šī apmācība, kurā mēs parādīsim, kā izmantot abus ESP32 kodolus, lai vienlaikus veiktu divas darbības. Pirmais uzdevums būs mirgot borta gaismas diode un otrais uzdevums būs iegūt temperatūras datus no DHT11 sensora.
Vispirms apskatīsim daudzkodolu procesora priekšrocības salīdzinājumā ar vienu kodolu.
Daudzkodolu procesora priekšrocības
- Daudzkodolu procesori ir noderīgi, ja vienlaikus darbojas vairāk nekā 2 procesi.
- Tā kā darbs tiek sadalīts starp dažādiem kodoliem, tā ātrums palielinās un vienlaikus var pabeigt vairākus procesus.
- Enerģijas patēriņu var samazināt, jo, ja jebkurš kodols ir dīkstāves režīmā, to var izmantot, lai izslēgtu perifērijas ierīces, kuras tajā laikā netiek izmantotas.
- Divkodolu procesoriem ir jāpārslēdzas starp dažādiem pavedieniem retāk nekā viena kodola procesoriem, jo tie vienlaikus var rīkoties ar diviem, nevis vienu.
ESP32 un FreeRTOS
ESP32 dēlī jau ir instalēta FreeRTOS programmaparatūra. FreeRTOS ir atvērtā koda reāllaika operētājsistēma, kas ir ļoti noderīga daudzuzdevumu veikšanā. RTOS palīdz pārvaldīt resursus un maksimizēt sistēmas veiktspēju. FreeRTOS ir daudz API funkciju dažādiem mērķiem, un, izmantojot šīs API, mēs varam izveidot uzdevumus un likt tiem darboties dažādos kodolos.
Pilna FreeRTOS API dokumentācija ir atrodama šeit. Mēs centīsimies izmantot dažus API savā kodā, lai izveidotu daudzuzdevumu lietojumprogrammu, kas darbosies abos kodolos.
ESP32 koda ID atrašana
Šeit mēs izmantosim Arduino IDE, lai kodu augšupielādētu ESP32. Lai uzzinātu galveno ID, kurā darbojas kods, ir API funkcija
xPortGetCoreID ()
Šo funkciju var izsaukt, izmantojot funkciju void setup () un void loop (), lai uzzinātu pamata ID, kurā darbojas šīs funkcijas.
Jūs varat pārbaudīt šo API, augšupielādējot šo skici:
void setup () { Serial.begin (115200); Serial.print ("funkcija setup () darbojas uz kodola:"); Serial.println (xPortGetCoreID ()); } void loop () { Serial.print ("funkcija loop (), kas darbojas uz kodola:"); Serial.println (xPortGetCoreID ()); }
Pēc augšminētās skices augšupielādes atveriet sērijas monitoru un atradīsit, ka abas funkcijas darbojas core1, kā parādīts zemāk.
No iepriekš minētajiem novērojumiem var secināt, ka noklusējuma Arduino skice vienmēr darbojas uz core1.
ESP32 divkodolu programmēšana
Arduino IDE atbalsta FreeRTOS ESP32 un FreeRTOS API ļauj mums izveidot uzdevumus, kurus var darbināt neatkarīgi abos kodolos. Uzdevums ir koda gabals, kas uz kuģa veic kādu darbību, piemēram, mirgo led, sūtīšanas temperatūra utt.
Tālāk sniegtā funkcija tiek izmantota, lai izveidotu uzdevumus, kurus var darbināt abos kodolos. Šajā funkcijā mums jāsniedz daži argumenti, piemēram, prioritāte, galvenais ID utt.
Lai izveidotu uzdevumu un uzdevuma funkciju, veiciet tālāk norādītās darbības.
1. Vispirms izveidojiet uzdevumus void setup funkcijā. Šeit mēs izveidosim divus uzdevumus, vienu LED mirgošanai ik pēc 0,5 sekundēm, un vēl viens uzdevums ir iegūt temperatūras rādījumus ik pēc 2 sekundēm.
Funkcijai xTaskCreatePinnedToCore () nepieciešami 7 argumenti:
- Funkcijas nosaukums uzdevuma īstenošanai (task1)
- Jebkurš uzdevumam piešķirtais nosaukums (“task1” utt.)
- Uzdevumam piešķirtais kaudzes lielums vārdos (1 vārds = 2 baiti)
- Uzdevuma ievades parametrs (var būt NULL)
- Uzdevuma prioritāte (0 ir zemākā prioritāte)
- Uzdevuma rokturis (var būt NULL)
- Galvenais ID, kur tiks izpildīts uzdevums (0 vai 1)
Tagad izveidojiet Task1, lai mirgot LED, norādot visus argumentus funkcijā xTaskCreatePinnedToCore ().
xTaskCreatePinnedToCore (1. uzdevuma kods, "1. uzdevums", 10000, NULL, 1, NULL, 0);
Līdzīgi, izveidot Task2 par Task2 un veikt galveno id 1 no 7 th argumentu.
xTaskCreatePinnedToCore (Task2code, "Task2", 10000, NULL, 1, NULL, 1);
Jūs varat mainīt prioritāti un kaudzes lielumu atkarībā no uzdevuma sarežģītības.
2. Tagad mēs ieviesīsim Task1code un Task2code funkcijas. Šīs funkcijas satur nepieciešamā uzdevuma kodu. Mūsu gadījumā pirmais uzdevums mirgos led un cits uzdevums iegūs temperatūru. Tāpēc izveidojiet divas atsevišķas funkcijas katram uzdevumam ārpus void iestatīšanas funkcijas.
Task1code funkcija, lai mirgotu borta LED pēc 0,5 sekundēm, tiek ieviesta, kā parādīts zemāk.
Void Task1code (void * parametrs) { Serial.print ("1. uzdevums darbojas uz kodola"); Serial.println (xPortGetCoreID ()); par (;;) {// bezgalīgas cilpas digitalWrite (vadīts, AUGSTS); kavēšanās (500); digitalWrite (LED, LOW) nekavējoties (500); } }
Līdzīgi ieviešiet funkciju Task2code temperatūras iegūšanai.
void Task2code (void * pvParameters) { Serial.print ("2. uzdevums darbojas uz kodola"); Serial.println (xPortGetCoreID ()); par (;;) { pludiņš t = dht.readTemperature (); Serial.print ("Temperatūra:"); Sērijas.druka (t); kavēšanās (2000); } }
3. Šeit tukšuma cilpas funkcija paliks tukša. Kā mēs jau zinām, ka cilpa un iestatīšanas funkcija darbojas uz core1, lai jūs varētu ieviest core1 uzdevumu arī tukšās cilpas funkcija
Tagad kodēšanas daļa ir beigusies, tāpēc vienkārši augšupielādējiet kodu, izmantojot Arduino IDE, izvēlnē Rīki izvēloties ESP32 paneli. Pārliecinieties, vai DHT11 sensors ir pievienots ESP32 tapai D13.
Tagad rezultātus var kontrolēt Serial Monitor vai Arduino IDE, kā parādīts zemāk:
Sarežģītas lietojumprogrammas, piemēram, reāllaika sistēmu, var izveidot, vienlaikus izpildot vairākus uzdevumus, izmantojot ESP32 divkodolus.
Pilns kods kopā ar demonstrācijas video ir norādīts zemāk.