Arduino-Verzögerungsfunktion und warum Sie sie nicht verwenden sollten

| Von

Arduino-Verzögerung

Als Sie anfingen, herauszufinden, wie man für den Arduino erstellt, haben Sie wahrscheinlich ein Element entwickelt, das in etwa so funktioniert:

An Ihr Arduino angeschlossen wäre sicherlich ein einzelnes LED-Licht. Dies würde sich sicherlich jede Sekunde oder so ändern und auch ausschalten, und wird auch so lange fortgesetzt, bis das Arduino ausgeschaltet wird. Dies ist das „Hello World“-Programm von Arduino und veranschaulicht genau, wie einfach ein paar Codezeilen etwas Wesentliches entwickeln können.

arduino-geführt

Ich wette auch, dass Sie die Funktion delay () verwendet haben, um die Intervalle zwischen dem Aktivieren und dem Ausschalten des Lichts zu definieren. Aber unten ist die Sache: Während der Hold-up für Standard-Demos der Arduino-Funktionalität nützlich ist, sollten Sie ihn wirklich nicht in der realen Welt verwenden. Hier ist warum – und was Sie lieber verwenden sollten.

Genau wie Delay() funktioniert

Die Methode, mit der die Funktion delay() arbeitet, ist ziemlich einfach. Es akzeptiert eine einzelne ganze (oder Zahl) Nichtübereinstimmung. Diese Zahl steht für den Moment (in Millisekunden gemessen), den das Programm warten soll, bis es zur nächsten Codezeile geht.

Das Problem ist jedoch, dass die Funktion delay() keine gute Möglichkeit ist, Ihr Programm zu verzögern, da es sich um eine sogenannte „Blockierungsfunktion“ handelt.

Der Unterschied zwischen blockierenden und nicht blockierenden Funktionen

Um hervorzuheben, warum Blockierungsfunktionen sich schlecht verhalten, möchte ich Sie an zwei verschiedene Köche in einer Küche erinnern: Henry Blocking sowie Eduardo NonBlocking. Beide machen den gleichen Job, aber auf sehr unterschiedliche Weise.

Wenn Henry das Frühstück macht, beginnt er damit, zwei Runden Brot in den Toaster zu legen. Als es endlich klingelt und sich auch das Brot goldbraun wölbt, legt Henry es auf einen Teller und bricht zwei Eier in eine Bratpfanne. Wieder steht er bereit, während das Öl platzt und das Weiß zu binden beginnt. Als sie fertig sind, tellert er sie auf und fängt an, zwei Scheiben Speck zu braten. Sind sie ausreichend knusprig, nimmt er sie aus der Pfanne, legt sie auf den Teller und fängt auch an zu konsumieren.

arduino-chef

Eduardo arbeitet etwas anders. Während sein Brot toastet, fing er gerade an, seine Eier sowie Speck zu braten. Anstatt darauf zu warten, dass ein Produkt mit der Zubereitung der Speisen fertig ist, bevor er zum nächsten wechselt, kocht er mehrere Produkte gleichzeitig. Das Endergebnis ist, dass Eduardo weniger Zeit braucht, um das Frühstück zuzubereiten als Henry – und als Henry Blocking fertig ist, sind sowohl der Toast als auch die Eier kalt geworden.

Es ist ein lächerliches Beispiel, aber es zeigt den Faktor.

Behinderung Funktionen verhindern, dass ein Programm etwas anderes tut, bis dieser bestimmte Job tatsächlich abgeschlossen ist. Wenn Sie möchten, dass mehrere Aktivitäten gleichzeitig stattfinden, können Sie hold-up() einfach nicht verwenden.

Insbesondere wenn Ihre Anwendung erfordert, dass Sie kontinuierlich Informationen von angeschlossenen Sensoren erfassen, sollten Sie sich von der Verwendung der Funktion hold-up () fernhalten, da sie auf jeden Fall kurz anhält.

Die gute Nachricht ist, dass hold-up() nicht die einzige Möglichkeit ist, Ihr Programm beim Codieren für Arduino warten zu lassen.

Treffen Sie Millis()

Die Funktion millis() führt eine einzelne Aufgabe aus. Wenn es aufgerufen wird, gibt es (als langer Datentyp) die Anzahl der Millisekunden zurück, die tatsächlich verstrichen sind, wenn man bedenkt, dass das Programm zum ersten Mal veröffentlicht wurde. Warum ist das nützlich?

Denn mit ein wenig grundlegender Mathematik können Sie Aspekte Ihres Programms leicht „zeitlich“ festlegen, ohne die Funktionsweise zu beeinflussen. Das Folgende ist eine grundlegende Darstellung der Funktionsweise von millis(). Wie Sie sehen, schaltet das Programm das LED-Licht für 1000 Millisekunden (eine Sekunde) ein und danach aus. Aber am wichtigsten ist, dass es nicht blockierend ist.

Lassen Sie uns nun genau überprüfen, wie es mit Arduino zusammenarbeitet.

Arduino-Millis-Beispiel

Dieses Programm – die stark auf basiert eine aus der Arduino-Hauptdokumentation – funktioniert, indem die vorher dokumentierte Zeit von der aktuellen Zeit abgezogen wird. Wenn der Rest (dh die verstrichene Zeit unter Berücksichtigung der letzten Aufzeichnung) länger als das Intervall (in diesem Fall 1000 Millisekunden) ist, aktualisiert das Programm die Variable previousTime auf die vorhandene Zeit und schaltet entweder die LED ein oder aus.

Und aufgrund der Tatsache, dass es sich um einen nicht blockierenden Code handelt, muss jede Art von Code, der sich darüber hinaus befindet, normalerweise funktionieren.

Grundlegend, nicht wahr? Beachten Sie, wie wir die Variable currentTime als erzeugt haben ohne Vorzeichen lange. Ein Wert ohne Vorzeichen impliziert einfach, dass er niemals negativ sein kann; Wir tun dies, um sicherzustellen, dass die optimale Anzahl, die wir einsparen können, größer ist. Standardmäßig sind Zahlenvariablen autorisiert, was bedeutet, dass ein „kleines Bit“ des Speichers für diese Variable verwendet wird, um zu behalten, ob der Wert deklariert oder ungünstig ist. Indem wir definieren, dass es nur positiv ist, haben wir ein bisschen hinzugefügt, mit dem wir spielen können.

Unterbrechungen

Bisher haben wir mehr über einen Weg zum Technik-Timing in unserem Arduino-Programm erfahren, der besser ist als delay(). Aber es gibt noch einen anderen, besseren Weg, aber viel komplizierter: unterbricht Diese haben den Vorteil, dass Sie Ihr Arduino-Programm genau timen und schnell auf eine externe Eingabe reagieren können, jedoch asynchron.

Das deutet darauf hin, dass es in Verbindung mit dem Hauptprogramm läuft und ständig auf eine Gelegenheit wartet, ohne den Fluss Ihres Codes zu unterbrechen. Dies hilft Ihnen, effektiv auf Ereignisse zu reagieren, ohne die Leistung der Arduino-CPU zu beeinträchtigen.

Wenn ein Interrupt ausgelöst wird, stoppt er entweder das Programm oder ruft eine Funktion auf, die im Allgemeinen als an bezeichnet wird Interrupt-Handler oder ein Serviceroutine unterbrechen Wenn dies tatsächlich abgeschlossen ist, geht das Programm dann wieder zu dem zurück, was es war.

Der AVR-Chip, der den Arduino mit Strom versorgt, unterstützt nur Hardware-Störungen. Diese treten auf, wenn ein Eingangspin von High auf Low geht oder durch die eingebauten Timer des Arduino verursacht wird.

Es klingt rätselhaft. Auch verwirrend. Es ist jedoch nicht. Um zu sehen, wie sie funktionieren, und um einige Beispiele zu sehen, wie sie in der realen Welt verwendet werden, schlag die Arduino-Dokumente

Lassen Sie sich nicht blockieren

Die Verwendung von millis() erfordert im Vergleich zur Verwendung von hold-up() zugegebenermaßen ein wenig zusätzliche Arbeit. Aber glauben Sie mir, Ihre Programme werden es Ihnen sicherlich danken, und ohne sie können Sie auch kein Multitasking auf dem Arduino ausführen.

Wenn Sie ein Beispiel für millis() in einer realen Arduino-Aufgabe sehen möchten, werfen Sie einen Blick auf James Bruces Arduino Night Light sowie Sunrise Alarm.

Haben Sie irgendwelche anderen Blockierungsfunktionen gefunden, bei denen wir vorsichtig sein sollten? Lassen Sie mich die folgenden Bemerkungen verstehen, und wir werden uns unterhalten.

Bildnachweis: Arduino (Daniel Spieß) , Koch (Ollie Svenson)

Vieles haben wir in Bezug auf ein Mittel zur Technik des Timings in unserem Arduino-Programm entdeckt, das viel besser ist als hold-up(). Diese haben den Vorteil, dass Sie Ihr Arduino-Programm präzise timen und schnell auf eine externe Eingabe reagieren können, jedoch asynchron. Vertrauen Sie mir, Ihre Programme werden es Ihnen sicherlich danken, und Sie können ohne ihn kein Multitasking auf dem Arduino ausführen. Wenn Sie ein Beispiel für millis () sehen möchten, das in einem realen Arduino-Projekt verwendet wird, sehen Sie sich James Bruces Arduino Night Light and Sunrise Alarm an.[

Klicken Sie, um diesen Beitrag zu bewerten!
[Gesamt: 0 Durchschnitt: 0]

Andere verwandte Artikel

Schreibe einen Kommentar