Párhuzamos Feladatok (szálak) Végrehajtása Egy Arduino Programban

Tartalomjegyzék:

Párhuzamos Feladatok (szálak) Végrehajtása Egy Arduino Programban
Párhuzamos Feladatok (szálak) Végrehajtása Egy Arduino Programban

Videó: Párhuzamos Feladatok (szálak) Végrehajtása Egy Arduino Programban

Videó: Párhuzamos Feladatok (szálak) Végrehajtása Egy Arduino Programban
Videó: Ардуино уроки программирование для начинающих с 9 лет [с нуля] #ДомаВместе 2024, Lehet
Anonim

A mikroprocesszoros technológiában a párhuzamosan futó feladatokat Szálaknak nevezzük. Ez nagyon kényelmes, mert gyakran szükség van több művelet végrehajtására egyszerre. Lehetséges-e az Arduino mikrovezérlőt egyszerre több feladat végrehajtására, mint egy igazi processzort? Lássuk.

Párhuzamos folyamok egy Arduino programban
Párhuzamos folyamok egy Arduino programban

Szükséges

  • - Arduino;
  • - 1 LED;
  • - 1 piezo hangjelző.

Utasítás

1. lépés

Általánosságban elmondható, hogy az Arduino nem támogatja a valódi párhuzamosítást vagy a többszálas menetet.

De elmondhatja a mikrovezérlőnek, hogy ellenőrizze, eljött-e az ideje egy további háttér-feladat végrehajtásának a "loop ()" ciklus minden egyes ismétlésénél. Ebben az esetben a felhasználó számára úgy tűnik, hogy egyszerre több feladatot hajtanak végre.

Például villogjunk egy LED-et egy adott frekvencián, és ezzel párhuzamosan olyan hangokat bocsássunk ki, amelyek emelkednek és leesnek, mint egy sziréna a piezoelektromos sugárzóból.

A LED-et és a piezo-emittert is többször csatlakoztattuk az Arduino-hoz. Állítsuk össze az áramkört az ábra szerint. Ha egy LED-et egy "13" -tól eltérő digitális tűhöz csatlakoztat, ne felejtse el, hogy az áramkorlátozó ellenállása körülbelül 220 ohm.

A hangjelző és a LED kapcsolási rajza az Arduino-hoz
A hangjelző és a LED kapcsolási rajza az Arduino-hoz

2. lépés

Írjunk egy ilyen vázlatot, és töltsük fel az Arduino-ra.

A tábla betöltése után láthatja, hogy a vázlat nem pontosan úgy van végrehajtva, mint amire szükségünk van: amíg a sziréna nem működik teljesen, a LED nem villog, és szeretnénk, ha a sziréna megszólalása közben a LED villogna. Mi a probléma itt?

Az a tény, hogy ez a probléma nem oldható meg a szokásos módon. A feladatokat a mikrovezérlő szigorúan egymás után látja el. A "delay ()" operátor meghatározott időre késlelteti a program végrehajtását, és amíg ez az idő le nem telik, a következő programparancsok nem kerülnek végrehajtásra. Emiatt nem állíthatunk be más végrehajtási időtartamot az egyes feladatokhoz a program "ciklusában ()".

Ezért valahogyan szimulálnia kell a multitaskingot.

Csipogás és LED vezérlés sorozatban
Csipogás és LED vezérlés sorozatban

3. lépés

Azt a lehetőséget, amelyben az Arduino ál-párhuzamosan hajtja végre a feladatokat, az Arduino fejlesztői javasolják a https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay cikkben.

A módszer lényege, hogy a "loop ()" hurok minden egyes ismétlésével ellenőrizzük, hogy ideje-e villogni a LED-nek (egy háttérfeladat elvégzéséhez) vagy sem. És ha mégis, akkor megfordítjuk a LED állapotát. Ez egyfajta megkerülése a "delay ()" operátornak.

Ennek a módszernek jelentős hátránya, hogy a LED vezérlőegység előtti kódrészletet gyorsabban kell végrehajtani, mint a "ledInterval" LED villogó időintervalluma. Ellenkező esetben a villogás a szükségesnél ritkábban fordul elő, és nem érjük el a feladatok párhuzamos végrehajtásának hatását. Különösen vázlatunkban a sziréna hangváltásának időtartama 200 + 200 + 200 + 200 = 800 ms, és a LED villogási intervallumát 200 ms-ra állítottuk be. De a LED 800 msec periódussal villog, ami négyszer eltér attól, amit beállítottunk. Általánosságban elmondható, hogy ha a kódban a "delay ()" operátort használják, akkor nehéz az ál-párhuzamosságot szimulálni, ezért célszerű elkerülni.

Ebben az esetben szükséges lenne, hogy a sziréna hangvezérlő egysége ellenőrizze azt is, hogy eljött-e az idő, és nem használja a "delay ()" funkciót. De ez növelné a kód mennyiségét és rontaná a program olvashatóságát.

A LED késleltetés nélkül villog () kezelő
A LED késleltetés nélkül villog () kezelő

4. lépés

A probléma megoldásához a csodálatos ArduinoThread könyvtárat fogjuk használni, amely lehetővé teszi az ál-párhuzamos folyamatok egyszerű létrehozását. Hasonló módon működik, de lehetővé teszi, hogy ne írjon kódot az idő ellenőrzéséhez - függetlenül attól, hogy ebben a ciklusban kell-e végrehajtania a feladatot, vagy sem. Ez csökkenti a kód mennyiségét és javítja a vázlat olvashatóságát. Nézzük meg a könyvtárat működés közben.

Először töltse le a könyvtár archívumát a https://github.com/ivanseidel/ArduinoThread/archive/master.zip hivatalos webhelyről, és csomagolja ki az Arduino IDE "könyvtárak" könyvtárába. Ezután nevezze át az "ArduinoThread-master" mappát "ArduinoThread" -re.

Az ArduinoThread könyvtár telepítése
Az ArduinoThread könyvtár telepítése

5. lépés

A csatlakozási ábra ugyanaz marad. Csak a programkód változik. Most ugyanaz lesz, mint az oldalsávban.

A programban két folyamot hozunk létre, amelyek mindegyike elvégzi a maga működését: az egyik LED-el villog, a második a sziréna hangját vezérli. A hurok minden iterációjában, minden szálnál ellenőrizzük, hogy eljött-e az ideje a végrehajtásának, vagy sem. Ha megérkezik, elindításra kerül a "run ()" módszerrel. A lényeg, hogy ne használja a "delay ()" operátort.

Részletesebb magyarázatokat a kód tartalmaz.

Töltsük be a kódot az Arduino memóriába, futtassuk. Most minden pontosan úgy működik, ahogy kellene!

Ajánlott: