- Предности вишејезгреног процесора
- ЕСП32 и ФрееРТОС
- Проналажење ИД-а језгра ЕСП32
- ЕСП32 двојезгрено програмирање
ЕСП модули су популарни због својих Ви-Фи функционалности попут ЕСП8266, ЕСП-12Е, итд. Све су то моћни микроконтролерски модули са Ви-Фи функционалностима. Постоји још један ЕСП модул који је моћнији и свестранији од претходних ЕСП модула - његово име је ЕСП32. Има Блуетоотх и Ви-Фи конекцију и већ смо објаснили БЛЕ могућности ЕСП32 и користили ЕСП32 у многим ИоТ пројектима. Али врло мало људи зна да је ЕСП32 двојезгрени микроконтролер.
ЕСП32 има два 32-битна Тенсилица Кстенса ЛКС6 микропроцесора што га чини моћним двојезгреним (цоре0 и цоре1) микроконтролером. Доступан је у две варијанте једнојезгрени и двојезгрени. Али дуал-цоре варијанта је популарнија јер не постоји значајна разлика у цени.
ЕСП32 се може програмирати помоћу Ардуино ИДЕ, Еспрессиф ИДФ, Луа РТОС итд. Током програмирања са Ардуино ИДЕ, код ради само на Цоре1, јер је Цоре0 већ програмиран за РФ комуникацију. Али ево овог водича, показаћемо како користити обе језгре ЕСП32 за истовремено извршавање две операције. Овдје ће први задатак бити трептање уграђене ЛЕД диоде, а други задатак дохваћања података о температури са ДХТ11 сензора.
Прво да видимо предности вишејезгарног процесора у односу на једнојезгарни.
Предности вишејезгреног процесора
- Вишејезгрени процесори су корисни када постоји више од 2 процеса који истовремено раде.
- Како се рад дистрибуира између различитих језгара, његова брзина се повећава и више процеса може бити довршено истовремено.
- Потрошња енергије се може смањити, јер када је било које језгро у стању мировања, оно се може користити за искључивање периферних уређаја који у то време нису у употреби.
- Двојезгрени процесори морају да се пребацују између различитих нити ређе од једнојезгрених процесора, јер могу да обрађују две одједном уместо једну по једну.
ЕСП32 и ФрееРТОС
На плочи ЕСП32 већ је инсталиран фирмваре ФрееРТОС. ФрееРТОС је оперативни систем у стварном времену отвореног кода који је веома користан у мултитаскингу. РТОС помаже у управљању ресурсима и максимизирању перформанси система. ФрееРТОС има много АПИ функција за различите сврхе и помоћу ових АПИ-ја можемо да креирамо задатке и покренемо их на различитим језгрима.
Комплетну документацију ФрееРТОС АПИ-ја можете пронаћи овде. Покушаћемо да користимо неке АПИ-је у нашем коду за изградњу мултитаскинг апликације која ће радити на оба језгра.
Проналажење ИД-а језгра ЕСП32
Овде ћемо користити Ардуино ИДЕ за учитавање кода у ЕСП32. Постоји АПИ функција да бисте знали Цоре ИД на којем се код изводи
кПортГетЦореИД ()
Ова функција се може позвати из функције воид сетуп () и воид лооп () да би се знало ИД језгра на којем се извршавају ове функције.
Овај АПИ можете тестирати отпремањем доње скице:
воид сетуп () { Сериал.бегин (115200); Сериал.принт ("функција сетуп () која ради на језгру:"); Сериал.принтлн (кПортГетЦореИД ()); } воид лооп () { Сериал.принт ("лооп () фунцтион руннинг он цоре:"); Сериал.принтлн (кПортГетЦореИД ()); }
Након отпремања горње скице, отворите серијски монитор и открићете да се обе функције изводе на цоре1 као што је приказано доле.
Из горњих запажања може се закључити да подразумевана Ардуино скица увек ради на језгру1.
ЕСП32 двојезгрено програмирање
Ардуино ИДЕ подржава ФрееРТОС за ЕСП32, а ФрееРТОС АПИ-ји омогућавају нам да креирамо задатке који се могу независно покретати на оба језгра. Задатак је део кода који изводи неке операције на плочи попут трепћућег ЛЕД, температуре слања итд.
Функција у наставку се користи за креирање задатака који се могу изводити на оба језгра. У овој функцији морамо дати неке аргументе попут приоритета, ИД-а језгра итд.
Сада следите кораке у наставку да бисте креирали задатак и функцију задатка.
1. Прво креирајте задатке у функцији воид сетуп . Овде ћемо направити два задатка, један за трептање ЛЕД-а након сваких 0,5 секунди, а други задатак је очитавање температуре након сваке 2 секунде.
кТаскЦреатеПиннедТоЦоре () функција узима 7 аргумената:
- Назив функције за имплементацију задатка (таск1)
- Било које име дато задатку („задатак1“ итд.)
- Величина слога додељена задатку речима (1 реч = 2 бајта)
- Улазни параметар задатка (може бити НУЛЛ)
- Приоритет задатка (0 је најнижи приоритет)
- Ручица задатка (може бити НУЛЛ)
- Основни ИД где ће се задатак извршити (0 или 1)
Сада креирајте Таск1 за трептање водича давањем свих аргумената у функцији кТаскЦреатеПиннедТоЦоре ().
кТаскЦреатеПиннедТоЦоре (Таск1цоде, "Таск1", 10000, НУЛЛ, 1, НУЛЛ, 0);
Слично томе, креирајте Таск2 за Таск2 и направите цоре ид 1 у 7. аргументу.
кТаскЦреатеПиннедТоЦоре (Таск2цоде, "Таск2", 10000, НУЛЛ, 1, НУЛЛ, 1);
Можете променити приоритет и величину слога у зависности од сложености задатка.
2. Сада ћемо имплементирати Таск1цоде и Таск2цоде функцију. Ове функције садрже код потребног задатка. У нашем случају, први задатак ће трептати лед, а други задатак ће дохватити температуру. Дакле, направите две одвојене функције за сваки задатак изван функције подешавања празнине.
Таск1цоде Функција за блинкањем плочи челу после 0.5 секунди спроводи као што је приказано испод.
Воид Таск1цоде (воид * параметар) { Сериал.принт ("Таск1 трчи на језгру"); Сериал.принтлн (кПортГетЦореИД ()); фор (;;) {// бесконачна петља дигиталВрите (лед, ХИГХ); кашњење (500); дигиталВрите (лед, ЛОВ), кашњење (500); } }
Слично томе, примените функцију Таск2цоде за дохваћање температуре.
воид Таск2цоде (воид * пвПараметерс) { Сериал.принт ("Таск2 покренут на језгру"); Сериал.принтлн (кПортГетЦореИД ()); фор (;;) { флоат т = дхт.реадТемпературе (); Сериал.принт ("Температура:"); Сериал.принт (т); кашњење (2000); } }
3. Овде ће воид лооп функција остати празна. Као што већ знамо да се функција петље и подешавања изводи на цоре1, тако да можете да примените задатак цоре1 и у воид лооп функцији.
Сада је део кодирања завршен, па само отпремите код помоћу Ардуино ИДЕ-а избором плоче ЕСП32 у менију Алатке. Обавезно спојите ДХТ11 сензор на пин Д13 ЕСП32.
Сада се резултати могу надгледати на Сериал Монитор или Ардуино ИДЕ, као што је приказано доле:
Комплексне апликације попут система у реалном времену могу се изградити покретањем више задатака истовремено користећи двоструке језгре ЕСП32.
Комплетни код заједно са демо видеом је дат у наставку.