Mikroprotsessoritehnikas nimetatakse paralleelselt töötavaid ülesandeid lõimedeks. See on väga mugav, sest sageli on vaja teha korraga mitu toimingut. Kas Arduino mikrokontrollerit on võimalik panna täitma mitu ülesannet korraga, nagu päris protsessor? Vaatame.
See on vajalik
- - Arduino;
- - 1 LED;
- - 1 pieso-summeri.
Juhised
Samm 1
Üldiselt ei toeta Arduino tõelist paralleelsust ega mitmikeermelist töötamist.
Kuid võite öelda mikrokontrollerile, et see kontrolliks, kas on aeg teha tsükli "loop ()" igal kordusel mõni täiendav taustülesanne. Sel juhul tundub kasutajale, et korraga tehakse mitu ülesannet.
Näiteks vilgutame LED-i antud sagedusel ja kiirgame paralleelselt helisid, mis tõusevad ja kukuvad nagu piesoelektrilisest sireenist.
Oleme nii LED-i kui pieso-emitteri ühendanud Arduinoga rohkem kui üks kord. Pange kokku vooluring, nagu on näidatud joonisel. Kui ühendate LED-i muu digitaalse tihvtiga kui "13", pidage meeles, et voolut piirav takisti on umbes 220 oomi.
2. samm
Kirjutame sellise visandi ja laadime selle üles Arduinosse.
Pärast tahvli laadimist näete, et sketš ei ole täidetud täpselt nii, nagu meil seda vaja on: kuni sireen on täielikult töökorras, ei vilgu LED ja me soovime, et LED vilkuks sireeni kõlamise ajal. Mis siin probleem on?
Fakt on see, et seda probleemi ei saa tavapärasel viisil lahendada. Ülesandeid täidab mikrokontroller rangelt järjestikku. Operaator "delay ()" lükkab programmi täitmise kindlaksmääratud aja jooksul edasi ja kuni selle aja möödumiseni järgmisi programmi käske ei täideta. Seetõttu ei saa me programmi "loop ()" iga ülesande jaoks erinevat täitmise kestust määrata.
Seetõttu peate multitegumtöötlust kuidagi simuleerima.
3. samm
Valiku, milles Arduino täidab pseudoparalleelseid ülesandeid, pakuvad Arduino arendajad välja artiklis
Meetodi olemus on see, et iga "loop ()" silmuse korduse korral kontrollime, kas on aeg LED-i vilkuda (taustülesande täitmiseks) või mitte. Ja kui see juhtub, siis pöörame LED-i oleku ümber. See on omamoodi mööda operaatorist "delay ()".
Selle meetodi oluliseks puuduseks on see, et LED-juhtseadme ees olev koodisektsioon tuleb täita kiiremini kui LED-i "LEDInterval" vilkuva ajaintervall. Vastasel juhul toimub vilkumine harvemini kui vaja ja me ei saa ülesannete paralleelse täitmise efekti. Eelkõige on meie visandis sireeni heli muutumise kestus 200 + 200 + 200 + 200 = 800 ms ja me seadsime LED-i vilkumise intervalliks 200 ms. Kuid LED vilgub 800 msek perioodiga, mis erineb 4 korda sellest, mida me määrasime. Üldiselt, kui koodis kasutatakse operaatorit "delay ()", siis on pseudoparalleelsust raske simuleerida, seega on soovitatav seda vältida.
Sellisel juhul oleks vajalik, et sireeni heli juhtimisseade kontrolliks ka seda, kas aeg on kätte jõudnud või mitte, ja mitte kasutada viivitust (delay). Kuid see suurendaks koodi hulka ja halvendaks programmi loetavust.
4. samm
Selle probleemi lahendamiseks kasutame imelist ArduinoThreadi teeki, mis võimaldab teil hõlpsalt luua pseudoparalleelseid protsesse. See töötab sarnaselt, kuid see võimaldab teil aja kontrollimiseks mitte koodi kirjutada - kas peate selles tsüklis ülesande täitma või mitte. See vähendab koodi hulka ja parandab visandi loetavust. Tutvume raamatukoguga.
Kõigepealt laadige raamatukogu arhiiv alla ametlikult saidilt https://github.com/ivanseidel/ArduinoThread/archive/master.zip ja pakkige see Arduino IDE kataloogi "teegid" lahti. Seejärel nimetage kaust "ArduinoThread-master" ümber "ArduinoThread" -iks.
5. samm
Ühendusskeem jääb samaks. Ainult programmi kood muutub. Nüüd on see sama mis külgribal.
Programmis loome kaks voogu, millest igaüks täidab oma tegevust: üks vilgub LED-iga, teine juhib sireeni heli. Tsükli igas iteratsioonis kontrollime iga lõime puhul, kas on aeg selle teostamiseks kätte jõudnud või mitte. Kui see saabub, käivitatakse see käivitamiseks meetodi "run ()" abil. Peamine asi pole operaatori "delay ()" kasutamine.
Täpsemad selgitused on toodud koodeksis.
Laadime koodi Arduino mällu, käivitame selle. Nüüd töötab kõik täpselt nii nagu peaks!