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