Hvordan Utføre Parallelle Oppgaver (tråder) I Et Arduino-program

Innholdsfortegnelse:

Hvordan Utføre Parallelle Oppgaver (tråder) I Et Arduino-program
Hvordan Utføre Parallelle Oppgaver (tråder) I Et Arduino-program

Video: Hvordan Utføre Parallelle Oppgaver (tråder) I Et Arduino-program

Video: Hvordan Utføre Parallelle Oppgaver (tråder) I Et Arduino-program
Video: 🔧 Как быстро установить и настроить Arduino IDE. Проверка соединения. Уроки Arduino для начинающих 2024, November
Anonim

I mikroprosessorteknologi kalles oppgaver som kjører parallelt, Tråder. Dette er veldig praktisk, fordi det ofte er nødvendig å utføre flere operasjoner samtidig. Er det mulig å få Arduino-mikrokontrolleren til å utføre flere oppgaver samtidig, som en ekte prosessor? La oss se.

Parallelle strømmer i et Arduino-program
Parallelle strømmer i et Arduino-program

Det er nødvendig

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

Bruksanvisning

Trinn 1

Generelt støtter ikke Arduino ekte parallellisering eller multitrading.

Men du kan be mikrokontrolleren om å sjekke om tiden er inne for å utføre noen ekstra bakgrunnsoppgaver ved hver repetisjon av "loop ()" -syklusen. I dette tilfellet ser det ut til at brukeren utfører flere oppgaver samtidig.

La oss for eksempel blinke en LED med en gitt frekvens og parallelt sende ut lyder som stiger og faller som en sirene fra en piezoelektrisk emitter.

Vi har koblet både LED og piezo-emitter til Arduino mer enn en gang. La oss montere kretsen som vist på figuren. Hvis du kobler en LED til en annen digital pin enn "13", husk å ha en strømbegrensende motstand på ca 220 ohm.

Koblingsskjema for summer og LED til Arduino
Koblingsskjema for summer og LED til Arduino

Steg 2

La oss skrive en skisse som denne og laste den opp til Arduino.

Etter at du har lastet inn tavlen, kan du se at skissen ikke blir utført akkurat slik vi trenger den: til sirenen er helt i drift, vil ikke LED-lampen blinke, og vi vil at LED-lampen skal blinke UNDER sirenens lyd. Hva er problemet her?

Faktum er at dette problemet ikke kan løses på vanlig måte. Oppgavene utføres av mikrokontrolleren strengt sekvensielt. Operatøren "forsinkelse ()" forsinker kjøringen av programmet i en spesifisert tidsperiode, og til denne tiden utløper vil ikke følgende programkommandoer utføres. På grunn av dette kan vi ikke angi en annen utførelsesvarighet for hver oppgave i "loop ()" av programmet.

Derfor må du på en eller annen måte simulere multitasking.

Signal- og LED-kontroll i serie
Signal- og LED-kontroll i serie

Trinn 3

Alternativet der Arduino vil utføre oppgaver i pseudoparallell, er foreslått av Arduino-utviklerne i artikkelen

Essensen av metoden er at vi ved hver repetisjon av "loop ()" -sløyfen sjekker om det er på tide å blinke lysdioden (for å utføre en bakgrunnsoppgave) eller ikke. Og hvis den gjør det, så inverterer vi tilstanden til LED. Dette er en slags omgåelse av "forsinkelse ()" -operatøren.

En betydelig ulempe ved denne metoden er at kodeseksjonen foran LED-kontrollenheten må utføres raskere enn det blinkende tidsintervallet til "ledInterval" -LED. Ellers vil blinkingen forekomme sjeldnere enn nødvendig, og vi får ikke effekten av parallell utføring av oppgaver. Spesielt i vår skisse er varigheten av sirenelydendringen 200 + 200 + 200 + 200 = 800 msek, og vi setter LED-blinkintervallet til 200 msek. Men LED-en vil blinke med en periode på 800 msek, som er 4 ganger forskjellig fra det vi satte. Generelt sett, hvis operatøren "forsinkelse ()" brukes i koden, er det vanskelig å simulere pseudoparallellisme, så det anbefales å unngå det.

I dette tilfellet vil det være nødvendig for sirenelydkontrollenheten å også sjekke om tiden er kommet eller ikke, og ikke bruke "forsinkelse ()". Men dette vil øke mengden kode og forverre lesbarheten til programmet.

LED blinker uten forsinkelse ()
LED blinker uten forsinkelse ()

Trinn 4

For å løse dette problemet, vil vi bruke det fantastiske ArduinoThread-biblioteket, som lar deg enkelt lage pseudoparallelle prosesser. Det fungerer på en lignende måte, men det lar deg ikke skrive kode for å sjekke tiden - om du trenger å utføre oppgaven i denne sløyfen eller ikke. Dette reduserer mengden kode og forbedrer lesbarheten til skissen. La oss sjekke ut biblioteket i aksjon.

Først og fremst laster du ned biblioteksarkivet fra det offisielle nettstedet https://github.com/ivanseidel/ArduinoThread/archive/master.zip og pakker det ut i "biblioteker" -katalogen til Arduino IDE. Gi deretter navnet "ArduinoThread-master" -mappen til "ArduinoThread".

Installere ArduinoThread-biblioteket
Installere ArduinoThread-biblioteket

Trinn 5

Tilkoblingsskjemaet vil forbli det samme. Bare programkoden endres. Nå blir det det samme som i sidefeltet.

I programmet lager vi to strømmer, hver utfører sin egen operasjon: den ene blinker med en LED, den andre styrer lyden av sirenen. I hver gjentagelse av sløyfen, for hver tråd, sjekker vi om tiden er inne for utførelse eller ikke. Hvis den ankommer, lanseres den for kjøring ved hjelp av "run ()" -metoden. Det viktigste er ikke å bruke "forsinkelse ()" -operatøren.

Mer detaljerte forklaringer er gitt i koden.

La oss laste koden inn i Arduino-minnet, kjør den. Nå fungerer alt akkurat som det skal!

Anbefalt: