Hoe Om Parallelle Take (drade) Uit Te Voer In 'n Arduino-program

INHOUDSOPGAWE:

Hoe Om Parallelle Take (drade) Uit Te Voer In 'n Arduino-program
Hoe Om Parallelle Take (drade) Uit Te Voer In 'n Arduino-program

Video: Hoe Om Parallelle Take (drade) Uit Te Voer In 'n Arduino-program

Video: Hoe Om Parallelle Take (drade) Uit Te Voer In 'n Arduino-program
Video: ❓ Обязательно к просмотру начинающему в Arduino IDE (ошибка компилятора) 2024, November
Anonim

In mikroprosessortegnologie word take wat parallel loop, Threads genoem. Dit is baie handig, want dit is dikwels nodig om verskeie bewerkings gelyktydig uit te voer. Is dit moontlik om die Arduino-mikrobeheerder verskeie take tegelyk te laat uitvoer, soos 'n regte verwerker? Kom ons kyk.

Parallelle strome in 'n Arduino-program
Parallelle strome in 'n Arduino-program

Dit is nodig

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

Instruksies

Stap 1

Oor die algemeen ondersteun Arduino nie ware parallelisering of multithreading nie.

Maar u kan die mikrobeheerder opdrag gee om te kyk of die tyd aangebreek het om 'n addisionele agtergrondtaak uit te voer by elke herhaling van die "loop ()" - siklus. In hierdie geval sal dit vir die gebruiker lyk asof verskeie take gelyktydig uitgevoer word.

Kom ons knip byvoorbeeld 'n LED op 'n gegewe frekwensie en gee gelyktydig geluide wat soos 'n sirene van 'n piezo-elektriese emittor opkom en val.

Ons het die LED sowel as die piezo-emitter meer as een keer met die Arduino verbind. Laat ons die stroombaan saamstel soos getoon in die figuur. As u 'n LED aan 'n digitale pen anders as '13' koppel, moet u 'n stroombeperkende weerstand van ongeveer 220 ohm hê.

Bedradingsdiagram vir gonser en LED na Arduino
Bedradingsdiagram vir gonser en LED na Arduino

Stap 2

Kom ons skryf 'n skets soos hierdie en laai dit op Arduino.

Nadat u die bord gelaai het, kan u sien dat die skets nie presies uitgevoer word soos ons dit nodig het nie: totdat die sirene ten volle in werking is, sal die LED nie knip nie, en ons wil hê dat die LED tydens die sirene sal klink. Wat is die probleem hier?

Die feit is dat hierdie probleem nie op die gewone manier opgelos kan word nie. Die take word streng opeenvolgend deur die mikrobeheerder uitgevoer. Die operateur "vertraging ()" vertraag die uitvoering van die program vir 'n bepaalde tydperk, en totdat hierdie tyd verstryk, sal die volgende programopdragte nie uitgevoer word nie. As gevolg hiervan kan ons nie 'n verskillende uitvoeringstydperk vir elke taak in die "lus ()" van die program instel nie.

Daarom moet u multitasking op een of ander manier simuleer.

Beeper- en LED-beheer in serie
Beeper- en LED-beheer in serie

Stap 3

Die opsie waarin die Arduino take pseudo-parallel sal uitvoer, word deur die Arduino-ontwikkelaars voorgestel in die artikel

Die kern van die metode is dat ons by elke herhaling van die "lus ()" - lus kyk of dit tyd is om die LED (om 'n agtergrondtaak uit te voer) te knip of nie. En as dit wel gebeur, keer ons die toestand van die LED om. Dit is 'n soort omseiling van die operateur "vertraging ()".

'N Belangrike nadeel van hierdie metode is dat die kode-gedeelte voor die LED-beheereenheid vinniger uitgevoer moet word as die knipperende tydsinterval van die "ledInterval" -LED. Andersins, sal die knippering minder gereeld voorkom as wat nodig is, en sal ons nie die effek hê van parallelle uitvoering van take nie. In die skets is die duur van die sirene-klankverandering in die besonder 200 + 200 + 200 + 200 = 800 msek, en ons stel die LED-knipperinterval op 200 msek. Maar die LED sal knip met 'n tydperk van 800 ms, wat vier keer verskil van wat ons gestel het. Oor die algemeen, as die operator "vertraging ()" in die kode gebruik word, is dit moeilik om pseudo-parallelisme te simuleer, daarom is dit raadsaam om dit te vermy.

In hierdie geval is dit nodig dat die sirene-klankbeheereenheid ook moet kyk of die tyd aangebreek het of nie, en nie 'vertraging ()' gebruik nie. Maar dit sal die hoeveelheid kode verhoog en die leesbaarheid van die program vererger.

LED knipper sonder versuim () operateur
LED knipper sonder versuim () operateur

Stap 4

Om hierdie probleem op te los, sal ons die wonderlike ArduinoThread-biblioteek gebruik, waarmee u maklik pseudo-parallelle prosesse kan skep. Dit werk op 'n soortgelyke manier, maar u kan nie kode skryf om die tyd te kontroleer nie - of u die taak in hierdie lus moet uitvoer of nie. Dit verminder die hoeveelheid kode en verbeter die leesbaarheid van die skets. Kom ons kyk na die biblioteek in aksie.

Laai eerstens die biblioteekargief van die amptelike webwerf af https://github.com/ivanseidel/ArduinoThread/archive/master.zip en pak dit uit in die "biblioteke" -gids van die Arduino IDE. Hernoem dan die gids "ArduinoThread-master" na "ArduinoThread".

Die installering van die ArduinoThread-biblioteek
Die installering van die ArduinoThread-biblioteek

Stap 5

Die verbindingsdiagram sal dieselfde bly. Slegs die programkode sal verander. Nou sal dit dieselfde wees as in die sybalk.

In die program skep ons twee strome, elkeen voer sy eie bewerking uit: een knipper met 'n LED, die tweede beheer die geluid van die sirene. In elke herhaling van die lus, vir elke draad, kyk ons of die tyd aangebreek het vir die uitvoering daarvan of nie. As dit opdaag, word dit met die "run ()" - metode vir uitvoering geloods. Die belangrikste ding is om nie die operateur "vertraging ()" te gebruik nie.

Meer gedetailleerde verduidelikings word in die kode gegee.

Kom ons laai die kode in die Arduino-geheue, voer dit uit. Nou werk alles presies soos dit moet!

Aanbeveel: