Arduino Multitasking

Veröffentlicht von

Inhalt

  • Multitasking, um mehrere Dinge parallel auszuführen

Einführung

Applikationen mit Mikrocontrollern führen oft mehr als eine Tätigkeit gleichzeitig aus. Auf PCs mit modernen Betriebssystemen ist dies eine völlige Selbstverständlichkeit, bei Mikrocontrollern muss man sich selber um die parallele Abarbeitung der Tasks kümmern.

Die bislang oft eingesetzte delay -Funktion ist in den meisten Anwendungen, die mehr als eine Aufgabe durchführen, sehr kontraproduktiv. Sie blockiert den ganzen Prozessor, sodass nichts anderes gleichzeitig passieren kann. Will man etwa zwei LEDs mit unterschiedlichen Zeitintervallen blinken lassen, so ist dies mit der delay-Funktion fast nicht möglich.

Im Folgenden wird eine andere Strategie vorgestellt um eine quasi-parallele Ausführung zu ermöglichen. Sie basiert darauf Zeitmessungen vorzunehmen.

delay  vs. Zeitmessung

Das Blink-Beispiel verwendet die delay -Funktion, um den Blink-Zyklus für eine LED abzuarbeiten.

Während delay  ausgeführt wird, können keine anderen Befehle ausgeführt werden. Folgendes Beispiel ist eine Alternative, bei der das Programm nicht blockiert wird, sondern im loop mit jeder neuen Ausführung überprüft wird, ob ein entsprechendes Zeitintervall vergangen ist.

Beispiel 1: Blink ohne delay

Basierend auf dem Beispiel File -> Examples – > 02.Digital -> BlinkWithoutDelay

Code-Analyse

Die Variablen previousTime  und currentTime  sind vom Typ unsigned long . long s speichern wie int s nur ganze Zahlen, allerding können diese einen wesentlich größeren Bereich umfassen. Die Funktion millis()  gibt die aktuelle Zeit in Millisekunden seit dem Start des Programms aus.

Im loop wird zunächst die aktuelle Zeit abgefragt und dann mit der previousTime  verglichen. Ist die Differenz größergleich dem definierten Interval, dann wird eine Aktion ausgeführt (Umschalten der LED).

Das Prinzip dieser Methode basiert also darauf, dass der loop nicht blockiert, sondern immer wieder schnell hintereinander aufgerufen wird (bei einem Code wie oben beschrieben geschieht dies mehrere tausend mal pro Sekunde). Bei jedem Aufruf wird verglichen, ob ein gewisses Zeitintervall vergangen ist. Falls das Intervall vorbei ist, wird eine Aktion durchgeführt.

Multitasking am Arduino

Die Methode der Zeitmessung ist fast immer gegenüber dem delay zu bevorzugen. Folgendes Beispiel demonstriert die separate Behandlung von drei blinkenden LEDs. Es handelt sich hierbei um keine echte parallele Ausführung, da die Ausführung der aktionen tatsächlich nur sehr schnell hintereinander passieren.

Beispiel 2: Triple-Blink ohne delay

Beispiel 1 wird hier auf drei LED (an Pin 11, 12, 13) ausgeweitet. Für jede LED muss jeweils ihr Zustand (state), Zeit (previous) und Intervall (interval) gespeichert werden:

Code-Anmerkungen

In C sind Initialisierungen von mehreren Variablen auf einmal erlaubt. Der Ausdruck int led1, led2, led3; legt also drei Variablen vom Typ int  an. Dasselbe gilt für Zuweisungen. previous1 = previous2 = previous3 = currentTime; bedeutet, dass alle 3 previous -Variablen den Wert von currentTime  bekommen.

Zusammenfassung

Die delay -Funktion sollte nach Möglichkeit im Programmcode nicht eingesetzt werden. Um Zeitintervalle zu überprüfen empfiehlt sich die Verwendung der millis() -Funktion, die die aktuelle Zeit in Millisekunden seit Start des Programms zurückgibt. Mittels Differenzberechnung der aktuellen Zeit und einer zuletzt gespeicherten Zeit kann man Zeitintervalle überprüfen, ohne das die Ausführung des restlichen Programms blockiert wird.

Weiterführende Links

  • Vergleich von Zeitpunkten und Intervallen: http://arduino.stackexchange.com/questions/12587/how-can-i-handle-the-millis-rollover

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.