Sådan Udføres Parallelle Opgaver (tråde) I Et Arduino-program

Indholdsfortegnelse:

Sådan Udføres Parallelle Opgaver (tråde) I Et Arduino-program
Sådan Udføres Parallelle Opgaver (tråde) I Et Arduino-program

Video: Sådan Udføres Parallelle Opgaver (tråde) I Et Arduino-program

Video: Sådan Udføres Parallelle Opgaver (tråde) I Et Arduino-program
Video: 🔧 Как быстро установить и настроить Arduino IDE. Проверка соединения. Уроки Arduino для начинающих 2024, April
Anonim

I mikroprocessorteknologi kaldes opgaver, der kører parallelt, tråde. Dette er meget praktisk, fordi det ofte er nødvendigt at udføre flere operationer på samme tid. Er det muligt at få Arduino-mikrocontrolleren til at udføre flere opgaver på én gang, som en rigtig processor? Lad os se.

Parallelle streams i et Arduino-program
Parallelle streams i et Arduino-program

Er det nødvendigt

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

Instruktioner

Trin 1

Generelt understøtter Arduino ikke ægte parallelisering eller multithreading.

Men du kan bede mikrokontrolleren om at kontrollere, om tiden er inde til at udføre nogle ekstra baggrundsopgaver ved hver gentagelse af "loop ()" -cyklussen. I dette tilfælde ser det ud til, at brugeren udfører flere opgaver samtidigt.

Lad os for eksempel blinke en LED med en given frekvens og parallelt udsende lyde, der stiger og falder som en sirene fra en piezoelektrisk emitter.

Vi har tilsluttet både LED og piezo-emitter til Arduino mere end én gang. Lad os samle kredsløbet som vist på figuren. Hvis du tilslutter en LED til en anden digital pin end "13", skal du huske at have en strømbegrænsende modstand på ca. 220 ohm.

Ledningsdiagram for summer og LED til Arduino
Ledningsdiagram for summer og LED til Arduino

Trin 2

Lad os skrive en skitse som denne og uploade den til Arduino.

Efter ilægning af tavlen kan du se, at skitsen ikke udføres nøjagtigt, som vi har brug for den: indtil sirenen er fuldt funktionsdygtig, blinker LED'en ikke, og vi vil gerne have, at LED'en blinker UNDER sirenens lyd. Hvad er problemet her?

Faktum er, at dette problem ikke kan løses på den sædvanlige måde. Opgaverne udføres af mikrokontrolleren strengt sekventielt. Operatoren "forsinkelse ()" forsinker udførelsen af programmet i et bestemt tidsrum, og indtil dette tidspunkt udløber, udføres følgende programkommandoer ikke. På grund af dette kan vi ikke indstille en anden udførelsesvarighed for hver opgave i programmets "loop ()".

Derfor skal du på en eller anden måde simulere multitasking.

Bipper- og LED-kontrol i serie
Bipper- og LED-kontrol i serie

Trin 3

Den mulighed, hvor Arduino vil udføre opgaver i pseudo-parallel, foreslås af Arduino-udviklerne i artiklen

Essensen af metoden er, at ved hver gentagelse af "loop" ("loop") kontrollerer vi, om det er tid til at blinke LED'en (for at udføre en baggrundsopgave) eller ej. Og hvis det gør det, så inverterer vi LED-tilstanden. Dette er en slags omgåelse af "forsinkelse ()" - operatøren.

En væsentlig ulempe ved denne metode er, at kodesektionen foran LED-styreenheden skal udføres hurtigere end det blinkende tidsinterval for "ledInterval" LED. Ellers vil blinkingen forekomme sjældnere end nødvendigt, og vi får ikke effekten af parallel udførelse af opgaver. Især i vores skitse er varigheden af sirenens lydændring 200 + 200 + 200 + 200 = 800 msek, og vi indstiller LED-blinkintervallet til 200 msek. Men LED'en blinker med en periode på 800 msek, hvilket er 4 gange forskellig fra det, vi har indstillet. Generelt, hvis operatøren "forsinkelse ()" bruges i koden, er det vanskeligt at simulere pseudoparallelisme, så det tilrådes at undgå det.

I dette tilfælde ville det være nødvendigt, at sirenelydkontrolenheden også kontrollerer, om tiden er kommet eller ej, og ikke bruger "forsinkelse ()". Men dette vil øge mængden af kode og forværre læsbarheden af programmet.

LED blinker uden forsinkelse () operatør
LED blinker uden forsinkelse () operatør

Trin 4

For at løse dette problem bruger vi det vidunderlige ArduinoThread-bibliotek, som giver dig mulighed for nemt at oprette pseudoparallelle processer. Det fungerer på en lignende måde, men det giver dig mulighed for ikke at skrive kode for at kontrollere tiden - uanset om du har brug for at udføre opgaven i denne sløjfe eller ej. Dette reducerer mængden af kode og forbedrer læsbarheden af skissen. Lad os tjekke biblioteket i aktion.

Først og fremmest skal du downloade biblioteksarkivet fra det officielle websted https://github.com/ivanseidel/ArduinoThread/archive/master.zip og pakke det ud i "biblioteker" -mappen på Arduino IDE. Omdøb derefter mappen "ArduinoThread-master" til "ArduinoThread".

Installation af ArduinoThread-biblioteket
Installation af ArduinoThread-biblioteket

Trin 5

Forbindelsesdiagrammet forbliver det samme. Kun programkoden ændres. Nu vil det være det samme som i sidepanelet.

I programmet opretter vi to streams, hver udfører sin egen operation: den ene blinker med en LED, den anden styrer lyden af sirenen. I hver iteration af sløjfen for hver tråd kontrollerer vi, om tiden er inde til dens udførelse eller ej. Hvis den ankommer, startes den til udførelse ved hjælp af metoden "run ()". Det vigtigste er ikke at bruge operatoren "delay ()".

Mere detaljerede forklaringer findes i koden.

Lad os indlæse koden i Arduino-hukommelsen, kør den. Nu fungerer alt som det skal!

Anbefalede: