U mikroprocesorskoj tehnologiji zadaci koji se izvode paralelno nazivaju se niti. To je vrlo povoljno, jer je često potrebno istodobno izvesti nekoliko operacija. Je li moguće natjerati Arduino mikrokontroler da izvršava nekoliko zadataka odjednom, poput pravog procesora? Da vidimo.
Nužno je
- - Arduino;
- - 1 LED;
- - 1 piezo zujalo.
Upute
Korak 1
Općenito 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 će se slučaju korisniku činiti da se istovremeno izvršava nekoliko zadataka.
Na primjer, trepnimo LED na zadanoj frekvenciji i paralelno emitiramo zvukove koji se iz piezoelektričnog odašiljača dižu i spuštaju poput sirene.
Više puta smo spajali i LED i piezo emiter na Arduino. Sastavimo sklop kao što je prikazano na slici. Ako spajate LED na digitalni pin koji nije "13", imajte na umu da mora imati otpor za ograničavanje 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 točno onako kako nam treba: dok sirena ne bude potpuno u funkciji, LED neće treptati, a mi bismo željeli 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 sekvencijalno. 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 trebate nekako simulirati višezadaćnost.
3. korak
Opciju u kojoj će Arduino izvršavati zadatke u pseudo-paraleli predlažu programeri Arduino u članku
Bit 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-a. Ovo je vrsta zaobilaženja operatora "delay ()".
Značajni nedostatak ove metode je taj što se kodni dio ispred upravljačke jedinice LED mora izvršiti brže od vremenskog intervala treptanja LED-a "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. No, 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 tom bi slučaju bilo potrebno da jedinica za kontrolu sirene također provjeri je li došlo vrijeme ili ne i da ne koristi "delay ()". Ali to bi povećalo količinu koda i pogoršalo čitljivost programa.
4. korak
Da bismo riješili taj problem, poslužit ćemo se prekrasnom bibliotekom ArduinoThread koja vam omogućuje lako stvaranje pseudo-paralelnih procesa. Djeluje na sličan način, ali omogućuje vam da ne pišete kôd kako biste provjerili vrijeme - trebate li izvršiti zadatak u ovoj petlji ili ne. To smanjuje količinu koda i poboljšava čitljivost skice. Provjerimo knjižnicu na djelu.
Prije svega preuzmite arhivu knjižnice sa službene stranice https://github.com/ivanseidel/ArduinoThread/archive/master.zip i otpakirajte je u direktorij "knjižnice" 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 dvije struje, svaka izvodi vlastitu operaciju: jedna trepće LED-om, druga 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 točno onako kako bi trebalo!