Ist Setup und Loop zur Bequemlichkeit vorgesehen?

13

Arduino-Skizzen weisen normalerweise eine setupund loop-Funktion auf. Werden diese Funktionen nur zur Vereinfachung bereitgestellt oder haben sie tatsächlich spezielle Zwecke? (zB: sind einige Operationen in Setup und Loop nicht erlaubt oder erlaubt)

Entsprechen diese beiden Codeteile:

Klassisch

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
}

Ohne Schleife

void setup() {
    pinMode(LED_BUILTIN, OUTPUT);

    while(true) {
        digitalWrite(LED_BUILTIN, HIGH);
        delay(1000);
        digitalWrite(LED_BUILTIN, LOW);
        delay(1000);
    }
}


void loop() {
}

Ist es möglich, Code ohne Setup oder Schleife zu schreiben, beispielsweise mit einer mainMethode oder einem anderen Einstiegspunkt?

Sebazzz
quelle

Antworten:

10

Diese Teile des Codes sind ziemlich gleich.

Wenn Sie sich den Arduino-Quellcode ansehen, werden Sie sehen:

setup();

for (;;) {
  loop();
  if (serialEventRun) serialEventRun();
}

(Ich bin nicht sicher, was serialEventRun()tut.)

Ich glaube nicht, dass Sie die mainFunktionsdeklaration überladen können. Beachten Sie auch, dass die Hauptfunktionsaufrufe init, die z. B. die Timer millis()usw. konfigurieren, funktionieren.

Gerben
quelle
9

Werden diese Funktionen nur zur Vereinfachung bereitgestellt oder haben sie tatsächlich spezielle Zwecke?

Die Arduino-Bibliotheken kümmern sich ein wenig loop()um die serielle Abwicklung .

Entsprechen diese beiden Codeteile:

Nur wenn Sie niemals serielle Ereignisse verwenden.

Ist es möglich, Code ohne Setup oder ohne Schleife zu schreiben und beispielsweise eine Hauptmethode oder einen anderen Einstiegspunkt bereitzustellen?

Nicht, wenn die Arduino-Bibliotheken ausschließlich über die IDE verwendet werden. Der Linker wird sich über doppelte mainDefinitionen oder über fehlende setupoder fehlende loopDefinitionen beschweren .

Ignacio Vazquez-Abrams
quelle
2

Ist es möglich, Code ohne Setup oder ohne Schleife zu schreiben und beispielsweise eine Hauptmethode oder einen anderen Einstiegspunkt bereitzustellen?

Das letzte Mal, als ich die IDE verwendet habe, konnten Sie ein Projekt ohne .ino/ .pdefile haben, nur .cppDateien; da es das Zerfleischen von .inoin ist .cpp, das die mainFunktion definiert , können Sie, wenn Sie diesen Schritt umgehen, Ihre eigene definieren main.

Wenn die IDE dies nicht mehr zulässt (wie ich gehört habe), können Sie dasselbe auch mit einem Makefile-basierten Build außerhalb der IDE tun, ohne die Arduino-Bibliotheken aufzugeben. Die Vorbehalte, die ich kenne, sind:

  • Sie sollten, #include "Arduino.h"wenn Sie Zugriff auf die Bibliotheksfunktionen möchten.
  • Sie sollten anrufen, init()wenn die Bibliothek Peripheriegeräte wie gewohnt einrichten soll.
  • Sie sollten den serialEventCode, auf den Gerben hinweist, in Ihren Mainloop einfügen, wenn ein serialEventHandler ausgeführt werden soll (aber Sie benötigen ihn wahrscheinlich sowieso nicht, wenn Sie Ihren eigenen Mainloop schreiben möchten).
hobbs
quelle
1

Arduino-Skizzen verfügen normalerweise über eine Setup- und Loop-Funktion. Werden diese Funktionen nur zur Vereinfachung bereitgestellt oder haben sie tatsächlich spezielle Zwecke?

Sie werfen einen zusätzlichen Funktionsaufruf auf, initder die Zeitgeber initialisiert, die lassen millis, microsund delayarbeiten ohne weiteren Aufwand. Ansonsten nein.

Dieser Code wird unter der IDE kompiliert (und ausgeführt):

int main ()
  {
  }

Tatsächlich generiert die IDE Code wie folgt:

int main ()
  {
  init ();  // set up timers
  setup (); // your own initialization
  while (true)
    loop ();  // stuff you want to keep doing
  }

Sie haben seitdem damit herumgespielt, wie Ignacio Vazquez-Abrams sagte, aber im Grunde kann man das ignorieren. Es gibt nichts besonderes an setupund loop.

Sie können mainwie oben gezeigt verwenden. Sie können alles tun, setupwenn Sie wollen. Sie können alles tun, loopwenn Sie wollen (wenn Sie nie von ihm zurückkehren).

Denken Sie daran, Sie haben es hier mit einem C ++ - Compiler zu tun. Funktionen haben aufgrund ihrer Namen keine magische Bedeutung.

Nick Gammon
quelle