Cum Să Efectuați Sarcini Paralele (fire) într-un Program Arduino

Cuprins:

Cum Să Efectuați Sarcini Paralele (fire) într-un Program Arduino
Cum Să Efectuați Sarcini Paralele (fire) într-un Program Arduino

Video: Cum Să Efectuați Sarcini Paralele (fire) într-un Program Arduino

Video: Cum Să Efectuați Sarcini Paralele (fire) într-un Program Arduino
Video: How to do multiple tasks in Arduino | Beginners | millis() function 2024, Noiembrie
Anonim

În tehnologia microprocesorului, sarcinile care rulează în paralel se numesc Threads. Acest lucru este foarte convenabil, deoarece este adesea necesar să efectuați mai multe operații în același timp. Este posibil ca microcontrolerul Arduino să efectueze mai multe sarcini simultan, ca un procesor real? Sa vedem.

Fluxuri paralele într-un program Arduino
Fluxuri paralele într-un program Arduino

Este necesar

  • - Arduino;
  • - 1 LED;
  • - 1 sonor piezo.

Instrucțiuni

Pasul 1

În general, Arduino nu acceptă o paralelizare adevărată sau multithreading.

Dar puteți spune microcontrolerului să verifice dacă a sosit timpul să executați o sarcină suplimentară de fundal la fiecare repetare a ciclului „loop ()”. În acest caz, utilizatorul va părea că mai multe sarcini sunt efectuate simultan.

De exemplu, să clipim un LED la o anumită frecvență și, în paralel, să emitem sunete care cresc și cad ca o sirena de la un emițător piezoelectric.

Am conectat atât LED-ul cât și emițătorul piezo la Arduino de mai multe ori. Să asamblăm circuitul așa cum se arată în figură. Dacă conectați un LED la un pin digital, altul decât „13”, nu uitați să aveți un rezistor de limitare a curentului de aproximativ 220 ohmi.

Schema de cablare pentru buzzer și LED către Arduino
Schema de cablare pentru buzzer și LED către Arduino

Pasul 2

Să scriem o schiță ca aceasta și să o încărcăm pe Arduino.

După încărcarea plăcii, puteți vedea că schița nu este executată exact așa cum trebuie: până când sirena este complet funcțională, LED-ul nu va clipi și am dori ca LED-ul să clipească ÎN TIMPUL sunetei sirenei. Care este problema aici?

Faptul este că această problemă nu poate fi rezolvată în mod obișnuit. Sarcinile sunt efectuate de microcontroler strict secvențial. Operatorul „delay ()” întârzie execuția programului pentru o anumită perioadă de timp și, până la expirarea acestui timp, următoarele comenzi ale programului nu vor fi executate. Din acest motiv, nu putem seta o durată de execuție diferită pentru fiecare sarcină din „bucla ()” programului.

Prin urmare, trebuie să simulați cumva multitasking.

Control sonor și LED în serie
Control sonor și LED în serie

Pasul 3

Opțiunea în care Arduino va efectua sarcini în pseudo-paralel este sugerată de dezvoltatorii Arduino în articolul

Esența metodei este că, cu fiecare repetare a buclei "loop ()", verificăm dacă este timpul să clipim LED-ul (pentru a efectua o sarcină de fundal) sau nu. Și dacă da, atunci inversăm starea LED-ului. Acesta este un fel de ocolire a operatorului „delay ()”.

Un dezavantaj semnificativ al acestei metode este că secțiunea de cod din fața unității de control LED trebuie executată mai repede decât intervalul de timp intermitent al LED-ului „ledInterval”. În caz contrar, clipirea va apărea mai rar decât este necesar și nu vom obține efectul executării paralele a sarcinilor. În special, în schița noastră, durata schimbării sunetului sirenei este de 200 + 200 + 200 + 200 = 800 msec și setăm intervalul intermitent al LED-ului la 200 msec. Dar LED-ul va clipi cu o perioadă de 800 msec, care este de 4 ori diferită de ceea ce am setat. În general, dacă în cod este utilizat operatorul „delay ()”, atunci este dificil să simulăm pseudo-paralelismul, deci este recomandabil să-l evităm.

În acest caz, ar fi necesar ca unitatea de control al sunetului sirenei să verifice dacă a sosit sau nu timpul și să nu folosească „delay ()”. Dar acest lucru ar crește cantitatea de cod și ar înrăutăți lizibilitatea programului.

LED intermitent fără întârziere () operator
LED intermitent fără întârziere () operator

Pasul 4

Pentru a rezolva această problemă, vom folosi minunata bibliotecă ArduinoThread, care vă permite să creați cu ușurință procese pseudo-paralele. Funcționează într-un mod similar, dar vă permite să nu scrieți cod pentru a verifica ora - indiferent dacă trebuie să executați sarcina în această buclă sau nu. Acest lucru reduce cantitatea de cod și îmbunătățește lizibilitatea schiței. Să verificăm biblioteca în acțiune.

În primul rând, descărcați arhiva bibliotecii de pe site-ul oficial https://github.com/ivanseidel/ArduinoThread/archive/master.zip și dezarhivați-o în directorul „biblioteci” al IDE Arduino. Apoi redenumiți folderul „ArduinoThread-master” în „ArduinoThread”.

Instalarea bibliotecii ArduinoThread
Instalarea bibliotecii ArduinoThread

Pasul 5

Diagrama conexiunii va rămâne aceeași. Numai codul programului se va modifica. Acum va fi la fel ca în bara laterală.

În program, creăm două fluxuri, fiecare își efectuează propria operațiune: una clipește cu un LED, al doilea controlează sunetul sirenei. În fiecare iterație a buclei, pentru fiecare fir, verificăm dacă a sosit timpul pentru execuția sa sau nu. Dacă ajunge, este lansat pentru execuție folosind metoda "run ()". Principalul lucru nu este să folosiți operatorul „delay ()”.

Explicații mai detaliate sunt date în cod.

Să încărcăm codul în memoria Arduino, să îl rulăm. Acum totul funcționează exact așa cum ar trebui!

Recomandat: