U mikroprocesorskoj tehnologiji, zadaci koji se izvode paralelno nazivaju se niti. To je vrlo povoljno, jer je često potrebno izvesti nekoliko operacija istovremeno. Je li moguće natjerati Arduino mikrokontroler da izvršava nekoliko zadataka odjednom, poput pravog procesora? Da vidimo.
Neophodno je
- - Arduino;
- - 1 LED;
- - 1 piezo zujalica.
Instrukcije
Korak 1
Uopšteno govoreći, Arduino ne podržava istinsku paralelizaciju ili multithreading.
Ali možete reći mikrokontroleru da provjeri je li došlo vrijeme za izvršavanje nekog dodatnog, pozadinskog zadatka pri svakom ponavljanju ciklusa "loop ()". U ovom slučaju, korisniku će se činiti da se istovremeno izvršava nekoliko zadataka.
Na primjer, trepnimo LED na određenoj frekvenciji i paralelno emitiramo zvukove koji se iz piezoelektričnog emitora dižu i spuštaju poput sirene.
Više puta smo spajali LED i piezo emiter na Arduino. Sastavimo sklop kako je prikazano na slici. Ako spajate LED na digitalni pin koji nije "13", imajte na umu da imate otpornik za ograničenje struje od oko 220 ohma.
Korak 2
Napišimo ovakvu skicu i prenesite je na Arduino.
Nakon učitavanja ploče, možete vidjeti da se skica ne izvršava baš onako kako nam treba: dok sirena ne bude potpuno u funkciji, LED neće treptati, a željeli bismo da LED trepće TIJEKOM zvuka sirene. U čemu je problem ovdje?
Činjenica je da se ovaj problem ne može riješiti na uobičajeni način. Zadaće mikrokontroler izvodi strogo uzastopno. Operator "delay ()" odgađa izvršenje programa na određeno vremensko razdoblje i dok to vrijeme ne istekne, sljedeće programske naredbe neće se izvršavati. Zbog toga ne možemo postaviti različito trajanje izvršenja za svaki zadatak u "petlji ()" programa.
Stoga morate nekako simulirati višezadaćnost.
Korak 3
Opciju u kojoj će Arduino izvršavati zadatke pseudo-paralelno, Arduino programeri predlažu u članku
Suština metode je da sa svakim ponavljanjem petlje "loop ()" provjeravamo je li vrijeme da trepćemo LED (za izvršavanje pozadinskog zadatka) ili ne. A ako se dogodi, tada invertiramo stanje LED diode. Ovo je vrsta zaobilaženja operatora "delay ()".
Značajan nedostatak ove metode je taj što se kodni dio ispred LED upravljačke jedinice mora izvršiti brže od vremenskog intervala treptanja LED diode "ledInterval". U suprotnom, treptanje će se događati rjeđe nego što je potrebno i nećemo dobiti učinak paralelnog izvršavanja zadataka. Konkretno, u našoj skici trajanje promjene zvuka sirene je 200 + 200 + 200 + 200 = 800 msec, a interval treptanja LED postavili smo na 200 msec. Ali LED će treptati s vremenom od 800 msec, što je 4 puta drugačije od onoga što smo postavili. Općenito, ako se u kodu koristi operator "delay ()", tada je teško simulirati pseudo-paralelizam, pa ga je poželjno izbjeći.
U ovom slučaju, bilo bi potrebno da jedinica za kontrolu sirene također provjeri je li došlo vrijeme ili ne i da ne koristi "delay ()". Ali ovo bi povećalo količinu koda i pogoršalo čitljivost programa.
Korak 4
Da bismo riješili ovaj problem, poslužit ćemo se prekrasnom bibliotekom ArduinoThread koja vam omogućuje lako stvaranje pseudo-paralelnih procesa. Radi na sličan način, ali omogućava vam da ne pišete kôd da biste provjerili vrijeme - trebate li izvršiti zadatak u ovoj petlji ili ne. To smanjuje količinu koda i poboljšava čitljivost skice. Provjerimo biblioteku na djelu.
Pre svega preuzmite arhivu biblioteke sa službene stranice https://github.com/ivanseidel/ArduinoThread/archive/master.zip i otpakujte je u direktorij "biblioteke" Arduino IDE-a. Zatim preimenujte mapu "ArduinoThread-master" u "ArduinoThread".
Korak 5
Dijagram povezivanja ostat će isti. Promijenit će se samo programski kod. Sada će biti isto kao na bočnoj traci.
U programu stvaramo dva toka, svaki izvodi vlastitu operaciju: jedan trepće LED-om, drugi kontrolira zvuk sirene. U svakoj iteraciji petlje, za svaku nit, provjeravamo je li došlo vrijeme za njezino izvršavanje ili ne. Ako stigne, pokrenut je za izvršenje metodom "run ()". Glavna stvar je ne koristiti operator "delay ()".
Detaljnija objašnjenja data su u kodu.
Učitajmo kôd u Arduino memoriju, pokrenimo ga. Sada sve radi tačno kako bi trebalo!