Code für die einmalige Ausführung in Arduino


12

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 setupCode wird einmal pro Aus- und Einschalten ausgeführt und loopbei 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 setupFunktion, 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?


Eine Verwendung des exitBefehls wird in arduino.stackexchange.com/questions/188/…
TheDoctor

Antworten:


13

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 setupund loopFunktionen aufruft :

#include <Arduino.h>

int main(void)
{
    init();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();
    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }
    return 0;
}

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 Funktion void serialEvent(){}in Ihrem Code definieren, wird sie vollständig kompiliert und ist im produzierten Maschinencode nicht vorhanden.


Es fühlt sich komisch an, eine Antwort zu akzeptieren, die (noch) nicht die am höchsten bewertete ist. Aber die main()Funktionsdefinition zu sehen, war für meine Frage wirklich hilfreich. (Und Sie geben einen Konsens mit der Gruppe an, indem Sie setupstatt verwenden loop). Danke für deine Hilfe.
Apnorton

1
@anorton - Wenn Sie Zweifel haben, schauen Sie unter die Decke. Ich finde die Arduino-Plattform praktisch für das Prototyping, aber es ist größtenteils nur Boilerplate-Code. Zu verstehen, was es tut, kann bei der Entscheidung, wie man etwas entwirft, enorm hilfreich sein.
Connor Wolf

6

Normalerweise gehe ich zu Methode 2, aber am Ende mache ich Folgendes:

void setup() {
  //do setup stuff

  //do task
  init(); //Do start-up initialization steps
}

void init() {
  // do tasks on startup
}

void loop() {
  //do looping code
}

Mit dem obigen Setup kann mein Code noch besser organisiert werden.


die beste Antwort bisher +1, danke Alter, du hast mich gerettet!
Kyle

5

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.


3

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.


1

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.


0

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()in loop()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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.