Ako Vykonávať Paralelné úlohy (vlákna) V Programe Arduino

Obsah:

Ako Vykonávať Paralelné úlohy (vlákna) V Programe Arduino
Ako Vykonávať Paralelné úlohy (vlákna) V Programe Arduino

Video: Ako Vykonávať Paralelné úlohy (vlákna) V Programe Arduino

Video: Ako Vykonávať Paralelné úlohy (vlákna) V Programe Arduino
Video: Как прошить Arduino uno. Обзор платы. Arduino для начинающих. 2024, Smieť
Anonim

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.

Paralelné toky v programe Arduino
Paralelné toky v programe Arduino

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.

Schéma zapojenia bzučiaka a LED na Arduino
Schéma zapojenia bzučiaka a LED na Arduino

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.

Kontrolka pípania a LED v sérii
Kontrolka pípania a LED v sérii

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.

LED bliká bez oneskorenia () operátora
LED bliká bez oneskorenia () operátora

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“.

Inštalácia knižnice ArduinoThread
Inštalácia knižnice 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á!

Odporúča: