Inhaltsverzeichnis
Blockierend vs. Nichtblockierende Mehoden
Blockierende Methoden halten die Programmausführung an, bis sie vollständig abgeschlossen sind – während dieser Zeit werden keine anderen Aufgaben bearbeitet. Nicht blockierende Methoden hingegen ermöglichen es, mehrere Prozesse quasi gleichzeitig auszuführen, da sie den Ablauf nicht vollständig unterbrechen, sondern Aufgaben asynchron abarbeiten, beispielsweise durch zeitgesteuerte Überprüfungen.
Beispiel
Ein mBot soll sich vorwärts bewegen, während eine LED regelmäßig blinkt. Erkennt der Ultraschallsensor ein Hindernis in weniger als 15 cm Entfernung, soll der Roboter sofort anhalten.
Blockierende Umsetzung
In einer blockierenden Umsetzung wird delay()
zum Blinken verwendet. Während der Wartezeit kann der mBot keine neuen Sensordaten auslesen. Dadurch kann er erst nach Ablauf der Verzögerung auf ein Hindernis reagieren, was in der Regel zu einem verspäteten Anhalten führt.
Listing 1:MinimalesProgramm.ino
#include <MeMCore.h> MeDCMotor motor1(M1); MeDCMotor motor2(M2); MeUltrasonicSensor ultrasonic(PORT_3); MeRGBLed led(0, 2); double limit = 15; // Grenze 15 cm void setup() { led.setpin(13); } void loop() { double distance = ultrasonic.distanceCm(); // Abstand messen if (distance > limit ) { // freie Fahrt? motor1.run(-255); motor2.run(255); blinken(200); // blocking method } if (distance <= limit) { // stoppen ? motor1.run(0); motor2.run(0); // LEDs ausschalten led.setColor(0, 0, 0, 0); led.setColor(1, 0, 0, 0); led.show(); } } /* * Funktionen */ void blinken(int interval) { led.setColor(0, 255, 0, 0); // RGB-LED auf Rot setzen (LED 1) led.setColor(1, 255, 0, 0); // RGB-LED auf Rot setzen (LED 2) led.show(); delay(interval); // Blockiert den Code led.setColor(0, 0, 0, 0); // RGB-LED ausschalten (LED 1) led.setColor(1, 0, 0, 0); // RGB-LED ausschalten (LED 2) led.show(); delay(interval); // Blockiert den Code }
Nicht-blockierende Umsetzung
In einer nicht-blockierenden Umsetzung wird die LED mit millis()
gesteuert. Dadurch kann der mBot kontinuierlich Sensordaten auslesen und sofort stoppen, wenn er ein Hindernis erkennt, während die LED unabhängig weiterblinkt.
blinken
blockierend und einmal nicht blockierend ist.
Listing 1:MinimalesProgramm.ino
#include <MeMCore.h> MeDCMotor motor1(M1); MeDCMotor motor2(M2); MeUltrasonicSensor ultrasonic(PORT_3); MeRGBLed led(0, 2); double limit = 15; // Grenze 15 cm // ...drei Variablen für nicht-blockierende Methode! unsigned long previousMillis = 0; bool ledState = false; bool firstRun = true; void setup() { led.setpin(13); } void loop() { double distance = ultrasonic.distanceCm(); // Abstand messen if (distance > limit ) { // freie Fahrt? motor1.run(255); motor2.run(-255); blinken(200); // not-blocking method } if (distance <= limit) { // stoppen? motor1.run(0); motor2.run(0); // LEDs ausschalten, wenn der mBot stoppt led.setColor(0, 0, 0, 0); led.setColor(1, 0, 0, 0); led.show(); } } /* * Funktionen */ void blinken(int interval) { unsigned long currentMillis = millis(); // step: ..in progress if (!firstRun && (currentMillis - previousMillis < interval)) return; // step: .. toggle now! firstRun = false; previousMillis = currentMillis; ledState = !ledState; if (ledState) { led.setColor(0, 255, 0, 0); // RGB-LED auf Rot led.setColor(1, 255, 0, 0); // RGB-LED auf Rot } else { led.setColor(0, 0, 0, 0); // RGB-LED aus led.setColor(1, 0, 0, 0); // RGB-LED aus } led.show(); }
Erklärungen zum Quellcode
Die Variable firstRun
sorgt dafür, dass das Blinken beim ersten Aufruf sofort startet, statt erst nach dem ersten Intervall zu warten.
millis()
umgesetzt. Dadurch kann der Roboter während des Blinkens weiterhin den Abstandssensor abfragen und schneller auf Hindernisse reagieren. Im Test führte dies dazu, dass der Roboter zuverlässiger rechtzeitig stoppt und nicht mehr gegen die Wand fährt.
Zusammenfassung
Nicht-blockierende Methoden ermöglichen eine effizientere Steuerung des mBots, da Abläufe parallel ausgeführt werden können. Gleichzeitig sind blockierende Methoden einfacher umzusetzen und sind häufig ausreichend.
millis Vorteile der nicht-blockierenden Methode | delay Vorteile der blockierenden Methode |
---|---|
✅ Schnellere Reaktionszeit: Der Sensor wird kontinuierlich geprüft, sodass der mBot Hindernisse sofort erkennt und rechtzeitig anhalten kann, ohne durch Wartezeiten verzögert zu werden. | ✅ Einfache Umsetzung: Der Code ist leicht zu schreiben und zu verstehen, da Abläufe nacheinander ausgeführt werden, ohne komplexe Zeitsteuerung. |
✅ Parallele Abläufe: Der mBot kann gleichzeitig fahren, blinken und Hindernisse erkennen, da keine Aufgabe den Programmfluss blockiert. Dadurch reagiert das System dynamischer auf Veränderungen in der Umgebung. | ✅ In einfachen Anwendungen ausreichend: Wenn keine parallelen Abläufe oder schnelle Reaktionen erforderlich sind, kann die blockierende Methode eine pragmatische Lösung sein. |
✅ Effizienter Code: Anstatt auf eine feste Wartezeit zu warten, werden Aufgaben zeitgesteuert verarbeitet. So bleibt das System jederzeit aktiv und reaktionsfähig. |
Wann ist welche Methode sinnvoll?
Die blockierende Methode ist für einfache Abläufe gut geeignet, während die nicht-blockierende Methode notwendig wird, wenn mehrere Prozesse gleichzeitig laufen oder schnelle Reaktionen erforderlich sind.