In der Mikroprozessortechnik werden parallel laufende Aufgaben als Threads bezeichnet. Dies ist sehr praktisch, da oft mehrere Operationen gleichzeitig durchgeführt werden müssen. Ist es möglich, den Arduino-Mikrocontroller wie einen echten Prozessor mehrere Aufgaben gleichzeitig ausführen zu lassen? Wir werden sehen.
Es ist notwendig
- -Arduino;
- - 1 LED;
- - 1 Piezo-Summer.
Anleitung
Schritt 1
Im Allgemeinen unterstützt Arduino keine echte Parallelisierung oder Multithreading.
Sie können den Mikrocontroller jedoch anweisen, bei jeder Wiederholung des "loop()"-Zyklus zu überprüfen, ob die Zeit gekommen ist, eine zusätzliche Hintergrundaufgabe auszuführen. In diesem Fall scheint es für den Benutzer, dass mehrere Aufgaben gleichzeitig ausgeführt werden.
Lassen Sie uns zum Beispiel eine LED mit einer bestimmten Frequenz blinken und parallel dazu Töne aussenden, die wie eine Sirene von einem piezoelektrischen Emitter ansteigen und fallen.
Wir haben sowohl die LED als auch den Piezo-Emitter mehr als einmal mit dem Arduino verbunden. Lassen Sie uns die Schaltung wie in der Abbildung gezeigt zusammenbauen. Wenn Sie eine LED an einen anderen digitalen Pin als "13" anschließen, denken Sie daran, einen Strombegrenzungswiderstand von etwa 220 Ohm zu haben.
Schritt 2
Lassen Sie uns eine Skizze wie diese schreiben und auf Arduino hochladen.
Nach dem Laden der Platine sehen Sie, dass die Skizze nicht genau so ausgeführt wird, wie wir sie brauchen: Bis die Sirene voll funktionsfähig ist, blinkt die LED nicht und wir möchten, dass die LED WÄHREND des Sirenentons blinkt. Was ist hier das Problem?
Tatsache ist, dass dieses Problem nicht auf die übliche Weise gelöst werden kann. Die Aufgaben werden vom Mikrocontroller streng sequentiell ausgeführt. Der Operator "delay()" verzögert die Ausführung des Programms um einen bestimmten Zeitraum, und bis zum Ablauf dieser Zeit werden die folgenden Programmbefehle nicht ausgeführt. Aus diesem Grund können wir in der "Schleife ()" des Programms nicht für jede Aufgabe eine andere Ausführungsdauer einstellen.
Daher müssen Sie Multitasking irgendwie simulieren.
Schritt 3
Die Option, bei der der Arduino Aufgaben pseudoparallel durchführt, wird von den Arduino-Entwicklern im Artikel https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay vorgeschlagen.
Das Wesen der Methode besteht darin, dass wir bei jeder Wiederholung der Schleife "loop()" überprüfen, ob es Zeit ist, die LED zu blinken (um eine Hintergrundaufgabe auszuführen) oder nicht. Und wenn dies der Fall ist, invertieren wir den Zustand der LED. Dies ist eine Art Umgehung des Operators "delay()".
Ein wesentlicher Nachteil dieser Methode ist, dass der Codeabschnitt vor dem LED-Steuergerät schneller ausgeführt werden muss als das Blinkzeitintervall der LED „ledInterval“. Andernfalls tritt das Blinken weniger häufig als nötig auf und wir erhalten nicht den Effekt der parallelen Ausführung von Aufgaben. Insbesondere in unserer Skizze beträgt die Dauer des Sirenentonwechsels 200 + 200 + 200 + 200 = 800 ms, und wir stellen das LED-Blinkintervall auf 200 ms ein. Aber die LED blinkt mit einer Periode von 800 ms, was viermal anders ist als von uns eingestellt. Wenn im Code der Operator "delay()" verwendet wird, ist es im Allgemeinen schwierig, Pseudoparallelität zu simulieren, daher ist es ratsam, ihn zu vermeiden.
In diesem Fall wäre es erforderlich, dass die Sirenentonsteuerung auch prüft, ob die Zeit gekommen ist oder nicht, und nicht "Verzögerung ()" verwendet. Dies würde jedoch die Menge an Code erhöhen und die Lesbarkeit des Programms verschlechtern.
Schritt 4
Um dieses Problem zu lösen, verwenden wir die wunderbare ArduinoThread-Bibliothek, mit der Sie auf einfache Weise pseudoparallele Prozesse erstellen können. Es funktioniert ähnlich, aber es erlaubt Ihnen, keinen Code zu schreiben, um die Zeit zu überprüfen - ob Sie die Aufgabe in dieser Schleife ausführen müssen oder nicht. Dies reduziert die Codemenge und verbessert die Lesbarkeit der Skizze. Schauen wir uns die Bibliothek in Aktion an.
Laden Sie zunächst das Bibliotheksarchiv von der offiziellen Seite https://github.com/ivanseidel/ArduinoThread/archive/master.zip herunter und entpacken Sie es in das Verzeichnis "libraries" der Arduino IDE. Benennen Sie dann den Ordner "ArduinoThread-master" in "ArduinoThread" um.
Schritt 5
Der Anschlussplan bleibt gleich. Es ändert sich nur der Programmcode. Jetzt ist es das gleiche wie in der Seitenleiste.
Im Programm erstellen wir zwei Streams, von denen jeder seinen eigenen Vorgang ausführt: einer blinkt mit einer LED, der zweite steuert den Klang der Sirene. In jeder Iteration der Schleife prüfen wir für jeden Thread, ob die Zeit für seine Ausführung gekommen ist oder nicht. Wenn es ankommt, wird es mit der Methode "run()" zur Ausführung gestartet. Die Hauptsache ist, den Operator "delay()" nicht zu verwenden.
Genauere Erklärungen finden Sie im Code.
Laden wir den Code in den Arduino-Speicher, führen Sie ihn aus. Jetzt funktioniert alles genau wie es soll!