Kod jednorazowego wykonania w Arduino


12

Pytanie: Gdzie umieścić kod, jeśli chcę, aby był uruchamiany tylko raz na uruchomienie Arduino?

Tło: Używam mojego Arduino do wykonywania zadań, które należy wykonać raz na cykl zasilania. (Na przykład mój robot powinien jechać tylko raz za każdym razem, gdy go włączam - co więcej, i może spaść ze stołu).

Standardowy „szablon” Arduino IDE składa się loop()z setup()funkcji i. setupKod jest uruchamiany raz na cykl zasilania i loopjest ponownie zaczął każdym razem wykończeń.

Widzę dwa podejścia do kodu „Zadania jednorazowe”:

Metoda 1: „Zapętlenie raz”

void setup() {
  //do setup stuff
}

void loop() {
  //do task

  while(1) ; //Repeat forever, preventing function from re-starting
}

Metoda 2: „Tylko konfiguracja”

void setup() {
  //do setup stuff

  //do task
}

void loop() {
  //do nothing
}

Bardziej szczegółowa forma pytania: czy jedna z tych metod jest „lepsza” pod względem sprzętowym / programowym? (np. czy jest coś „specjalnego” w setupfunkcji, na przykład, że może działać tylko przez tak długi czas?).
A jeśli są one takie same z punktu widzenia sprzętu / oprogramowania, to czy istnieje „najlepsza praktyka” lub standardowy sposób pisania kodu w takich sytuacjach w społeczności Arduino?


Niektóre zastosowania tego exitpolecenia są omówione w arduino.stackexchange.com/questions/188/…
TheDoctor

Odpowiedzi:


13

Jestem trochę zdezorientowany twoim pytaniem. Pytasz, gdzie chcesz umieścić funkcje konfiguracji raz na uruchomienie, a następnie omawiasz funkcję konfiguracji. Do tego służy funkcja konfiguracji.

W związku z tym jednorazowa funkcja konfiguracji przechodzi w funkcję konfiguracji.

FWIW, jeśli spojrzeć w pliku, który nazywasetup i loopfunkcje:

#include <Arduino.h>

int main(void)
{
    init();

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

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

Dla wszystkich celów i celów obie opcje są całkowicie identyczne. Tak czy inaczej, otrzymasz pustą pętlę zajętości oczekiwania. Szczerze mówiąc, spodziewałbym się, że dwie różne opcje i tak prawdopodobnie wyemitują ten sam kod maszynowy, więc cała sprawa nie jest problemem.

Uwaga:
if (serialEventRun) serialEventRun();wydaje się być narzędziem pozwalającym na dołączenie funkcji, która jest wywoływana przy odbiorze danych szeregowych, ale jeśli nie zdefiniujesz funkcji void serialEvent(){}w kodzie, skompiluje się ona całkowicie i nie będzie obecna w wygenerowanym kodzie maszynowym.


Dziwnie jest zaakceptować odpowiedź, która nie jest (jeszcze) najwyżej oceniana. Ale zobaczenie main()definicji funkcji było bardzo pomocne w moim pytaniu. (I wskazujesz na zgodność z grupą przy użyciu setupzamiast zamiast loop). Dziękuję za pomoc
apnorton

1
@anorton - W razie wątpliwości zajrzyj pod okładki. Uważam, że platforma arduino jest wygodna do tworzenia prototypów, ale w dużej mierze jest to tylko prosty kod. Zrozumienie tego, co robi, może być niezwykle pomocne w podjęciu decyzji, jak coś zaprojektować.
Connor Wolf

6

Zwykle wybieram metodę 2, ale w końcu robię to:

void setup() {
  //do setup stuff

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

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

void loop() {
  //do looping code
}

Dzięki powyższej konfiguracji pozwala to na jeszcze lepszą organizację mojego kodu.


najlepsza jak dotąd odpowiedź +1, dzięki stary, uratowałeś mnie!
Kyle,

5

Zdecydowanie wolałbym Metodę 2. Jeśli kiedykolwiek planujesz dodać kod do obsługi danych wejściowych, wyjściowych itp., Metoda 2 jest łatwa - wystarczy wypełnić loop(), ale wymaga przerobienia / refaktoryzacji w Metodzie 1.


3

Funkcja konfiguracji nie ma ograniczenia czasowego. Wolę metodę 2, ponieważ pętlę można wypełnić tym, czego potrzebujesz później.


1

Zdecydowanie wybierz metodę drugą. Do tego służy funkcja konfiguracji. Jest również dużo łatwiejszy do odczytania. Wszystko, co loop()sugeruje, będzie działać w pętli.


0

Jak większość innych odpowiedzi, wybrałbym metodę 2.

Ale starałbym się uniknąć wezwania biblioteki Arduino do pustki, loop()która sprawia, że ​​Atmel zużywa „dużo” prądu za darmo.

Edytować:

Jak zauważyły ​​niektóre komentarze, użycie delay()w loop()nie zmieni niczego na zużycie energii.

Dlatego jeśli chcesz zmniejszyć zużycie energii po setup()uruchomieniu, będziesz musiał grać w trybach uśpienia Atmel. Możesz spojrzeć na ten artykuł, który pokazuje, jak radzić sobie z trybami snu na podstawie szkiców Arduino; robi więcej niż tylko uśpienie Atmela, ale jest dobrą (i prostą) lekturą, jeśli chcesz bawić się trybami snu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.