V mikroprocesorovej technológii sa úlohy bežiace paralelne nazývajú Threads. To je veľmi výhodné, pretože je často potrebné vykonať niekoľko operácií súčasne. Je možné prinútiť mikrokontrolér Arduino vykonávať niekoľko úloh naraz, ako skutočný procesor? Pozrime sa.
Je to nevyhnutné
- - Arduino;
- - 1 LED;
- - 1 piezoelektrický bzučiak.
Inštrukcie
Krok 1
Všeobecne povedané, Arduino nepodporuje skutočnú paralelizáciu alebo viacvláknové spracovanie.
Môžete však povedať mikrokontroléru, aby skontroloval, či nadišiel čas vykonať nejaké ďalšie úlohy na pozadí pri každom opakovaní cyklu „loop ()“. V takom prípade sa používateľovi bude zdať, že sa vykonáva niekoľko úloh súčasne.
Napríklad, bliknime LED na danej frekvencii a paralelne vydávajme zvuky, ktoré stúpajú a klesajú ako siréna z piezoelektrického vysielača.
K Arduinu sme viackrát pripojili LED aj piezoelektrický vysielač. Zostavíme obvod tak, ako je to znázornené na obrázku. Ak pripájate LED k digitálnemu kolíku inému ako „13“, nezabudnite mať odpor obmedzujúci prúd asi 220 ohmov.
Krok 2
Poďme napísať tento náčrt a nahrať ho do Arduina.
Po načítaní dosky môžete vidieť, že náčrt nie je vykonaný presne tak, ako by sme potrebovali: kým nebude siréna plne funkčná, LED dióda nebude blikať a my by sme chceli, aby LED dióda blikala POČAS zaznenia sirény. Aký je tu problém?
Faktom je, že tento problém nemožno vyriešiť obvyklým spôsobom. Úlohy vykonáva mikrokontrolér striktne postupne. Operátor „delay ()“oneskoruje vykonávanie programu o zadané časové obdobie a do uplynutia tejto doby sa nebudú vykonávať nasledujúce programové príkazy. Z tohto dôvodu nemôžeme pre každú úlohu v „loop ()“programu nastaviť inú dobu trvania.
Preto musíte nejako simulovať multitasking.
Krok 3
Možnosť, v ktorej bude Arduino vykonávať úlohy pseudo-paralelne, navrhujú vývojári Arduina v článku
Podstata metódy spočíva v tom, že pri každom opakovaní slučky „loop ()“kontrolujeme, či je čas na blikanie LED (na vykonanie úlohy na pozadí) alebo nie. A ak áno, obrátime stav LED. Toto je druh obchádzania operátora „delay ()“.
Významnou nevýhodou tejto metódy je, že kódová časť pred riadiacou jednotkou LED musí byť vykonaná rýchlejšie ako blikajúci časový interval LED „ledInterval“. V opačnom prípade bude blikanie prebiehať menej často, ako je potrebné, a nedostaneme tak efekt paralelného vykonávania úloh. Najmä v našom náčrte je doba zmeny zvuku sirény 200 + 200 + 200 + 200 = 800 ms a interval blikania LED sme nastavili na 200 ms. LED ale bude blikať s periódou 800 ms, čo je 4-krát odlišné od toho, čo sme nastavili. Všeobecne platí, že ak sa v kóde použije operátor „delay ()“, je ťažké simulovať pseudo-paralelizmus, preto je vhodné sa mu vyhnúť.
V takom prípade by bolo potrebné, aby jednotka riadenia zvuku sirény taktiež skontrolovala, či už nastal čas alebo nie, a aby nepoužila funkciu „delay ()“. To by však zvýšilo množstvo kódu a zhoršilo čitateľnosť programu.
Krok 4
Na vyriešenie tohto problému použijeme úžasnú knižnicu ArduinoThread, ktorá umožňuje jednoduché vytváranie pseudo-paralelných procesov. Funguje to podobným spôsobom, ale umožňuje vám to nepísať kód na kontrolu času - či už úlohu potrebujete vykonať v tejto slučke, alebo nie. To znižuje množstvo kódu a zlepšuje čitateľnosť náčrtu. Poďme sa pozrieť na knižnicu v akcii.
Najskôr si stiahnite archív knižnice z oficiálnej stránky https://github.com/ivanseidel/ArduinoThread/archive/master.zip a rozbaľte ju do adresára „libraries“IDE Arduino. Potom premenujte priečinok „ArduinoThread-master“na „ArduinoThread“.
Krok 5
Schéma pripojenia zostane rovnaká. Zmení sa iba programový kód. Teraz to bude rovnaké ako v bočnom paneli.
V programe vytvoríme dva prúdy, z ktorých každý vykonáva svoju vlastnú činnosť: jeden bliká LED, druhý ovláda zvuk sirény. V každej iterácii slučky pre každé vlákno kontrolujeme, či už nastal čas na jeho vykonanie alebo nie. Ak dorazí, spustí sa na vykonanie pomocou metódy „run ()“. Hlavnou vecou nie je používať operátor „delay ()“.
Podrobnejšie vysvetlenia sú uvedené v kóde.
Načítajme kód do pamäte Arduino, spustime ho. Teraz všetko funguje presne tak, ako má!