Frage: Wo gebe ich Code ein, wenn ich möchte, dass er nur einmal pro Arduino-Start ausgeführt wird?
Hintergrund: Ich benutze meinen Arduino in der Regel, um Aufgaben auszuführen, die einmal pro Aus- und Einschalten ausgeführt werden sollten. (Zum Beispiel sollte mein Roboter jedes Mal, wenn ich ihn einschalte, nur einmal vorwärts fahren - mehr als das, und es könnte vom Tisch fallen.)
Die standardmäßige Arduino IDE "Vorlage" besteht aus einer loop()
und einer setup()
Funktion. Der setup
Code wird einmal pro Aus- und Einschalten ausgeführt und loop
bei jedem Abschluss neu gestartet.
Ich sehe zwei Ansätze, um "1-malige Aufgaben" zu codieren:
Methode 1: "Schleife einmal"
void setup() {
//do setup stuff
}
void loop() {
//do task
while(1) ; //Repeat forever, preventing function from re-starting
}
Methode 2: "Nur Setup"
void setup() {
//do setup stuff
//do task
}
void loop() {
//do nothing
}
Detailliertere Fragestellung: Ist eine dieser Methoden aus Hardware- / Software-Sicht "besser"? (Gibt es beispielsweise etwas "Besonderes" an der setup
Funktion, das nur so lange ausgeführt werden kann?)
Und gibt es eine "bewährte Methode" oder eine Standardmethode zum Schreiben von Code, wenn diese aus Hardware- / Software-Sicht identisch sind für diese Situationen in der Arduino-Community?
quelle
exit
Befehls wird in arduino.stackexchange.com/questions/188/…Antworten:
Ihre Frage verwirrt mich ein bisschen. Sie fragen, wo Sie einmal pro Start Setup-Funktionen setzen möchten, und diskutieren dann die Setup-Funktion. Dafür gibt es die Setup-Funktion.
Die einmalige Einrichtungsfunktion ist daher Bestandteil der Einrichtungsfunktion.
FWIW, wenn Sie in die Datei schauen, die die
setup
undloop
Funktionen aufruft :In jeder Hinsicht sind die beiden Optionen völlig identisch. In beiden Fällen erhalten Sie eine leere Besetzt-Warteschleife. Ehrlich gesagt würde ich erwarten, dass die beiden verschiedenen Optionen wahrscheinlich sowieso den gleichen Maschinencode ausgeben, also ist das Ganze kein Problem.
Hinweis:
if (serialEventRun) serialEventRun();
Scheint eine Möglichkeit zu sein, eine Funktion anzuhängen, die beim Empfang von seriellen Daten aufgerufen wird. Wenn Sie jedoch keine Funktionvoid serialEvent(){}
in Ihrem Code definieren, wird sie vollständig kompiliert und ist im produzierten Maschinencode nicht vorhanden.quelle
main()
Funktionsdefinition zu sehen, war für meine Frage wirklich hilfreich. (Und Sie geben einen Konsens mit der Gruppe an, indem Siesetup
statt verwendenloop
). Danke für deine Hilfe.Normalerweise gehe ich zu Methode 2, aber am Ende mache ich Folgendes:
Mit dem obigen Setup kann mein Code noch besser organisiert werden.
quelle
Ich würde Methode 2 sehr bevorzugen. Wenn Sie jemals vorhaben, Code zur Verarbeitung von Eingaben, Ausgaben usw. hinzuzufügen, ist dies mit Methode 2 ganz einfach. Füllen Sie einfach Methode 1 aus
loop()
, aber Sie müssen sie überarbeiten / umgestalten.quelle
Die Setup-Funktion ist zeitlich unbegrenzt. Ich bevorzuge Methode 2, weil die Schleife mit allem gefüllt werden kann, was Sie später benötigen.
quelle
Auf jeden Fall mit Methode zwei gehen. Dafür gibt es die Setup-Funktion. Es ist auch viel einfacher zu lesen. Alles, was in den
loop()
Implikationen enthalten ist, wird in einer Schleife ausgeführt.quelle
Wie die meisten anderen Antworten würde ich mich für Methode 2 entscheiden.
Aber ich würde versuchen, den Aufruf der Arduino-Bibliothek zu einer Leerstelle zu vermeiden
loop()
, die den Atmel "viel" Strom für nichts verbrauchen lässt.Bearbeiten:
Wie in einigen Kommentaren bereits erwähnt, ändert die Verwendung von
delay()
inloop()
nichts am Stromverbrauch.Wenn Sie den Stromverbrauch nach dem
setup()
Start reduzieren möchten , müssen Sie daher mit den Atmel-Schlafmodi spielen. Sie können sich diesen Artikel ansehen , der zeigt, wie Sie mit Schlafmodi aus Ihren Arduino-Skizzen umgehen. Es ist mehr als nur das Einschlafen des Atmel, es ist jedoch eine gute (und einfache) Lektüre, wenn Sie mit Schlafmodi spielen möchten.quelle