In microprocessortechnologie worden taken die parallel worden uitgevoerd, threads genoemd. Dit is erg handig, omdat het vaak nodig is om meerdere handelingen tegelijk uit te voeren. Is het mogelijk om de Arduino-microcontroller meerdere taken tegelijk te laten uitvoeren, zoals een echte processor? Laten we kijken.
Het is nodig
- -Arduino;
- - 1 led;
- - 1 piëzo-zoemer.
instructies:
Stap 1
Over het algemeen ondersteunt Arduino geen echte parallellisatie of multithreading.
Maar je kunt de microcontroller vertellen om te controleren of het tijd is om een extra achtergrondtaak uit te voeren bij elke herhaling van de "loop ()"-cyclus. In dit geval zal het voor de gebruiker lijken dat verschillende taken tegelijkertijd worden uitgevoerd.
Laten we bijvoorbeeld een LED laten knipperen op een bepaalde frequentie en parallel geluiden uitzenden die stijgen en dalen als een sirene van een piëzo-elektrische zender.
We hebben zowel de LED als de piëzo-emitter meer dan eens op de Arduino aangesloten. Laten we het circuit samenstellen zoals weergegeven in de afbeelding. Als u een LED aansluit op een andere digitale pin dan "13", vergeet dan niet een stroombegrenzende weerstand van ongeveer 220 ohm te gebruiken.
Stap 2
Laten we zo'n schets schrijven en uploaden naar Arduino.
Na het laden van het bord, kun je zien dat de schets niet precies is uitgevoerd zoals we het nodig hebben: totdat de sirene volledig operationeel is, zal de LED niet knipperen en we willen dat de LED knippert TIJDENS het afgaan van de sirene. Wat is hier het probleem?
Feit is dat dit probleem niet op de gebruikelijke manier kan worden opgelost. De taken worden strikt sequentieel door de microcontroller uitgevoerd. De "delay ()"-operator vertraagt de uitvoering van het programma voor een gespecificeerde tijdsperiode, en totdat deze tijd verstrijkt, zullen de volgende programmacommando's niet worden uitgevoerd. Hierdoor kunnen we niet voor elke taak een andere uitvoeringsduur instellen in de "loop ()" van het programma.
Daarom moet je op de een of andere manier multitasking simuleren.
Stap 3
De optie waarbij de Arduino taken pseudo-parallel zal uitvoeren, wordt door de Arduino-ontwikkelaars gesuggereerd in het artikel
De essentie van de methode is dat we bij elke herhaling van de "loop ()" -lus controleren of het tijd is om de LED te laten knipperen (om een achtergrondtaak uit te voeren) of niet. En als dat zo is, dan keren we de status van de LED om. Dit is een soort omzeiling van de "delay ()"-operator.
Een belangrijk nadeel van deze methode is dat het codegedeelte voor de LED-regeleenheid sneller moet worden uitgevoerd dan het knipperende tijdsinterval van de "ledInterval" LED. Anders zal het knipperen minder vaak voorkomen dan nodig is en krijgen we niet het effect van parallelle uitvoering van taken. In onze schets is met name de duur van de verandering van het sirenegeluid 200 + 200 + 200 + 200 = 800 msec, en we stellen het LED-knipperinterval in op 200 msec. Maar de LED knippert met een periode van 800 msec, wat 4 keer anders is dan wat we hebben ingesteld. Als de operator "delay ()" in de code wordt gebruikt, is het in het algemeen moeilijk om pseudoparallelisme te simuleren, dus het is raadzaam om dit te vermijden.
In dit geval zou het nodig zijn dat de sirene-geluidsregeleenheid ook controleert of het tijd is of niet, en geen "vertraging ()" gebruikt. Maar dit zou de hoeveelheid code vergroten en de leesbaarheid van het programma verslechteren.
Stap 4
Om dit probleem op te lossen, zullen we de prachtige ArduinoThread-bibliotheek gebruiken, waarmee u eenvoudig pseudo-parallelle processen kunt maken. Het werkt op een vergelijkbare manier, maar het stelt je in staat om geen code te schrijven om de tijd te controleren - of je de taak in deze lus moet uitvoeren of niet. Dit vermindert de hoeveelheid code en verbetert de leesbaarheid van de schets. Laten we de bibliotheek in actie bekijken.
Download eerst het bibliotheekarchief van de officiële site https://github.com/ivanseidel/ArduinoThread/archive/master.zip en pak het uit in de map "bibliotheken" van de Arduino IDE. Hernoem vervolgens de map "ArduinoThread-master" naar "ArduinoThread".
Stap 5
Het aansluitschema blijft hetzelfde. Alleen de programmacode verandert. Nu zal het hetzelfde zijn als in de zijbalk.
In het programma creëren we twee streams, elk voert zijn eigen handeling uit: de ene knippert met een LED, de tweede regelt het geluid van de sirene. In elke iteratie van de lus, voor elke thread, controleren we of het tijd is voor uitvoering of niet. Als het aankomt, wordt het gestart voor uitvoering met behulp van de "run ()"-methode. Het belangrijkste is om de operator "delay ()" niet te gebruiken.
Meer gedetailleerde uitleg wordt gegeven in de code.
Laten we de code in het Arduino-geheugen laden en uitvoeren. Nu werkt alles precies zoals het hoort!