Sa teknolohiyang microprocessor, ang mga gawain na tumatakbo nang kahanay ay tinatawag na Mga Thread. Ito ay napaka-maginhawa, dahil madalas na kinakailangan upang magsagawa ng maraming mga operasyon nang sabay. Posible bang gawin ang Arduino microcontroller na magsagawa ng maraming mga gawain nang sabay-sabay, tulad ng isang tunay na processor? Tingnan natin.
Kailangan iyon
- - Arduino;
- - 1 LED;
- - 1 piezo buzzer.
Panuto
Hakbang 1
Sa pangkalahatan, hindi sinusuportahan ng Arduino ang tunay na parallelization, o multithreading.
Ngunit maaari mong sabihin sa microcontroller upang suriin kung dumating na ang oras upang magpatupad ng ilang karagdagang, gawain sa background sa bawat pag-uulit ng "loop ()" na ikot. Sa kasong ito, tila sa gumagamit na maraming gawain ang ginagawa nang sabay-sabay.
Halimbawa, pumikit tayo sa isang LED sa isang naibigay na dalas at, sa kahanay, naglalabas ng mga tunog na tumataas at bumagsak tulad ng isang sirena mula sa isang piezoelectric emitter.
Nakakonekta namin ang parehong LED at ang piezo emitter sa Arduino nang higit sa isang beses. Tipunin natin ang circuit tulad ng ipinakita sa pigura. Kung kumokonekta ka sa isang LED sa isang digital pin bukod sa "13", tandaan na magkaroon ng isang kasalukuyang nililimitahan na risistor ng halos 220 ohms.
Hakbang 2
Sumulat tayo ng isang sketch na tulad nito at i-upload ito sa Arduino.
Matapos mai-load ang board, maaari mong makita na ang sketch ay hindi naisakatuparan nang eksakto kung kailangan namin ito: hanggang sa ang pagpapatakbo ng sirena ay hindi ganap na kumikilos, ang LED ay hindi kumukurap, at nais naming kumislap ang LED SA tunog ng sirena. Ano ang problema dito?
Ang katotohanan ay ang problemang ito ay hindi malulutas sa karaniwang paraan. Ang mga gawain ay ginaganap ng microcontroller na mahigpit na sunud-sunod. Ang operator na "antala ()" ay naantala ang pagpapatupad ng programa para sa isang tinukoy na tagal ng panahon, at hanggang sa mag-expire ang oras na ito, ang mga sumusunod na utos ng programa ay hindi naisasagawa. Dahil dito, hindi kami maaaring magtakda ng iba't ibang tagal ng pagpapatupad para sa bawat gawain sa "loop ()" ng programa.
Samakatuwid, kailangan mong simulate kahit papaano ang multitasking.
Hakbang 3
Ang pagpipiliang kung saan ang Arduino ay magsasagawa ng mga gawain sa pseudo-parallel ay iminungkahi ng mga developer ng Arduino sa artikulong
Ang kakanyahan ng pamamaraan ay sa bawat pag-uulit ng "loop ()" na loop, susuriin natin kung oras na upang kumurap ng LED (upang maisagawa ang isang gawain sa background) o hindi. At kung gagawin ito, ibabaliktad natin ang estado ng LED. Ito ay isang uri ng pag-bypass sa "pagkaantala ()" na operator.
Ang isang makabuluhang kawalan ng pamamaraang ito ay ang seksyon ng code sa harap ng LED control unit na dapat na maisagawa nang mas mabilis kaysa sa blinking time interval ng "ledInterval" LED. Kung hindi man, ang pagkakurap ay magaganap nang mas madalas kaysa kinakailangan, at hindi kami makakakuha ng epekto ng parallel na pagpapatupad ng mga gawain. Sa partikular, sa aming sketch, ang tagal ng pagbabago ng tunog ng sirena ay 200 + 200 + 200 + 200 = 800 msec, at itinakda namin ang LED blinking interval sa 200 msec. Ngunit ang LED ay mag-flash sa isang tagal ng 800 msec, na 4 na beses na naiiba mula sa itinakda namin. Sa pangkalahatan, kung ang "pagkaantala ()" na operator ay ginagamit sa code, kung gayon mahirap na gayahin ang pseudo-parallelism, kaya ipinapayong iwasan ito.
Sa kasong ito, kinakailangan para sa siren sound control unit upang suriin din kung dumating na ang oras o hindi, at hindi gamitin ang "pagkaantala ()". Ngunit tataasan nito ang halaga ng code at magpapalala sa kakayahang mabasa ng programa.
Hakbang 4
Upang malutas ang problemang ito, gagamitin namin ang kahanga-hangang library ng ArduinoThread, na nagbibigay-daan sa iyo upang madaling makalikha ng mga proseso ng pseudo-parallel. Gumagana ito sa katulad na paraan, ngunit pinapayagan kang huwag magsulat ng code upang suriin ang oras - kung kailangan mo upang maisagawa ang gawain sa loop na ito o hindi. Binabawasan nito ang dami ng code at pinapabuti ang kakayahang mabasa ng sketch. Suriin natin ang aklatan na kumikilos.
Una sa lahat, i-download ang archive ng library mula sa opisyal na site https://github.com/ivanseidel/ArduinoThread/archive/master.zip at i-unzip ito sa direktoryo ng "mga aklatan" ng Arduino IDE. Pagkatapos ay palitan ang pangalan ng folder na "ArduinoThread-master" sa "ArduinoThread".
Hakbang 5
Ang diagram ng koneksyon ay mananatiling pareho. Ang code ng programa lamang ang magbabago. Ngayon ay magiging pareho ito sa sidebar.
Sa programa, lumilikha kami ng dalawang daloy, bawat isa ay nagsasagawa ng sarili nitong operasyon: ang isang blink ay may LED, ang pangalawang kumokontrol sa tunog ng sirena. Sa bawat pag-ulit ng loop, para sa bawat thread, sinusuri namin kung dumating na ang oras para sa pagpapatupad o hindi. Kung dumating ito, inilunsad ito para sa pagpapatupad gamit ang "run ()" na pamamaraan. Ang pangunahing bagay ay hindi gamitin ang "pagkaantala ()" na operator.
Ang mas detalyadong mga paliwanag ay ibinibigay sa code.
I-load natin ang code sa memorya ng Arduino, patakbuhin ito. Ngayon lahat ay gumagana nang eksakto tulad ng nararapat!