Mit quasiparallelen Tasks hatte ich mich ja schon einmal beschäftigt.
Hier noch ein Beispiel, wie man Zeitscheiben bzw. threads definieren kann:
// LEDs mit unabhängigen threads steuern #define LED_ROT 2 #define LED_GELB 3 #define LED_GRUEN 4 void setup() { pinMode(LED_ROT, OUTPUT); pinMode(LED_GELB, OUTPUT); pinMode(LED_GRUEN, OUTPUT); } // Zeitsteuerung mit Hilfe von Threads und dem Counter millis() // "static" bedeutet, dass die entsprechende lokale Variable ihren Wert permanent beibehält. // Die lokale Variable "warteSeit" existiert also eigentlich dreimal und // hat somit in jedem Thread einen eigenen, unabhängigen Wert. // das Gleiche gilt für die lokale Variable "zustand" void thread_rot() { static enum {AUS, EIN} zustand = AUS; // Aufzählung static unsigned long int warteSeit = 0; // Datentyp long ist bei millis() Pflicht! if (millis() - warteSeit > 100) { if (zustand == AUS) { digitalWrite(LED_ROT, HIGH); zustand = EIN; } else { digitalWrite(LED_ROT, LOW); zustand = AUS; } warteSeit = millis(); } } void thread_gelb() { static enum {AUS, EIN} zustand = AUS; // Aufzählung static unsigned long int warteSeit = 0; // Datentyp long ist bei millis() Pflicht! if (millis() - warteSeit > 888) { if (zustand == AUS) { digitalWrite(LED_GELB, HIGH); zustand = EIN; } else { digitalWrite(LED_GELB, LOW); zustand = AUS; } warteSeit = millis(); } } void thread_gruen() { static enum {AUS, EIN} zustand = AUS; // Aufzählung static unsigned long int warteSeit = 0; // Datentyp long ist bei millis() Pflicht! if (millis() - warteSeit > 357) { if (zustand == AUS) { digitalWrite(LED_GRUEN, HIGH); zustand = EIN; } else { digitalWrite(LED_GRUEN, LOW); zustand = AUS; } warteSeit = millis(); } } void loop() { thread_rot(); thread_gelb(); thread_gruen(); } |
.
Interessant ist hierbei, dass die einzelnen threads in jedem loop()-Durchlauf nacheinander gestartet werden und selbst eintscheiden, ob die Zeit für die Ausführung des Codes "reif" ist.
if (millis() - warteSeit > 888) bedeutet, dass erst nach Ablauf von 888 Millisekunden der danach folgende Code ausgeführt wird.
Weiterhin werden lokale Variablen vom Typ static verwendet.
So gibt es hier drei unabhängige lokale Variablen mit dem Namen warteSeit, die jedoch alle unabhängige Werte speichern und während des gesamten Programmablaufs erhalten bleiben.
"Einfache" lokale Variablen werden nach dem Verlassen der jeweiligen Funktion (z.B.
void thread_gruen()) wieder gelöscht.
Quelle: http://stefanfrings.de/multithreading_arduino/
.