Czy konfiguracja i pętla są zapewnione dla wygody?

13

Szkice Arduino zwykle zawierają funkcje setupi loop. Czy funkcje te są zapewniane wyłącznie dla wygody, czy rzeczywiście mają specjalne cele? (np .: czy niektóre operacje są niedozwolone lub dozwolone w konfiguracji i pętli)

Czy te dwa fragmenty kodu są równoważne:

Klasyczny

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

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

Bez pętli

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

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


void loop() {
}

Czy możliwe jest pisanie kodu bez konfiguracji lub pętli, podając na przykład mainmetodę lub inny punkt wejścia?

Sebazzz
źródło

Odpowiedzi:

10

Te fragmenty kodu są prawie takie same.

Jeśli spojrzysz na kod źródłowy Arduino , zobaczysz:

setup();

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

(Nie jestem pewien, co serialEventRun()robi.)

Nie sądzę, żeby można było przeciążać maindeklarację funkcji. Zauważ też, że główne wywołania funkcji init, które np. Konfigurują timery, więc millis()itd. Będą działać.

Gerben
źródło
9

Czy funkcje te są zapewniane wyłącznie dla wygody, czy rzeczywiście mają specjalne cele?

Biblioteki Arduino zajmują się drobnymi czynnościami loop()związanymi z obsługą szeregową .

Czy te dwa fragmenty kodu są równoważne:

Tylko jeśli nigdy nie używasz zdarzeń seryjnych.

Czy możliwe jest pisanie kodu bez konfiguracji lub pętli, zapewniając na przykład główną metodę lub inny punkt wejścia?

Nie podczas ścisłego korzystania z bibliotek Arduino przez IDE; łącznik będzie skarżyć albo zduplikowane maindefinicje lub brakujących setuplub loopdefinicje.

Ignacio Vazquez-Abrams
źródło
2

Czy możliwe jest pisanie kodu bez konfiguracji lub pętli, zapewniając na przykład główną metodę lub inny punkt wejścia?

Ostatnim razem, gdy użyłem IDE, mogłeś mieć projekt bez pliku .ino/ .pdetylko .cpppliki; ponieważ to przeplatanie się .inow a .cppdefiniuje mainfunkcję, jeśli pominiesz ten krok, możesz zdefiniować własne main.

Jeśli IDE już na to nie pozwala (jak słyszałem), nadal możesz zrobić to samo, np. Z kompilacją opartą na Makefile poza IDE, bez rezygnacji z bibliotek Arduino. Zastrzeżenia, które znam, to:

  • Powinieneś, #include "Arduino.h"jeśli chcesz uzyskać dostęp do funkcji biblioteki.
  • Powinieneś zadzwonić, init()jeśli chcesz, aby biblioteka skonfigurowała urządzenia peryferyjne w sposób, w jaki jesteś przyzwyczajony.
  • Powinieneś umieścić serialEventkod, który Gerben wskazuje na swojej głównej pętli, jeśli chcesz, serialEventaby działał moduł obsługi (ale prawdopodobnie i tak nie potrzebujesz tego, jeśli chcesz napisać własną pętlę główną).
Hobbs
źródło
1

Szkice Arduino zwykle zawierają funkcję konfiguracji i pętli. Czy funkcje te są zapewniane wyłącznie dla wygody, czy rzeczywiście mają specjalne cele?

Wrzucają dodatkowe wywołanie funkcji, initktóre inicjuje czasomierze, które pozwalają millis, microsi delaydziałają bez dalszego wysiłku. Poza tym nie.

Ten kod kompiluje (i uruchamia) w IDE:

int main ()
  {
  }

W efekcie IDE generuje kod w następujący sposób:

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

Od tamtej pory bawili się nim, jak powiedział Ignacio Vazquez-Abrams, ale w zasadzie można to zignorować. Nie ma nic szczególnego w setupi loop.

Możesz używać maintak, jak pokazałem powyżej. Możesz zrobić wszystko, setupjeśli chcesz. Możesz zrobić wszystko, loopjeśli chcesz (jeśli nigdy z niego nie wrócisz).

Pamiętaj, że masz tutaj do czynienia z kompilatorem C ++. Funkcje nie mają żadnego magicznego znaczenia na podstawie ich nazw.

Nick Gammon
źródło