Codice per l'esecuzione singola in Arduino


12

Domanda: dove inserisco il codice se voglio che venga eseguito una sola volta all'avvio di Arduino?

Background: tendo ad usare il mio Arduino per eseguire attività che dovrebbero essere eseguite una volta per ciclo di accensione. (Ad esempio, il mio robot dovrebbe avanzare solo una volta ogni volta che lo accendo - più di questo, e potrebbe cadere dal tavolo.)

Il "modello" IDE Arduino standard è costituito da una loop()e una setup()funzione. Il setupcodice viene eseguito una volta per ciclo di accensione e loopviene riavviato ogni volta che termina.

Vedo due approcci al codice "1 attività temporali:"

Metodo 1: "Ripeti una volta"

void setup() {
  //do setup stuff
}

void loop() {
  //do task

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

Metodo 2: "Solo installazione"

void setup() {
  //do setup stuff

  //do task
}

void loop() {
  //do nothing
}

Domanda più dettagliata: uno di questi metodi è "migliore" dal punto di vista hardware / software? (es. c'è qualcosa di "speciale" nella setupfunzione, come può funzionare solo per così tanto tempo?)
E, se sono uguali dal punto di vista hardware / software, esiste una "best practice" o un modo standard di scrivere codice per queste situazioni nella comunità di Arduino?


Qualche uso del exitcomando è discusso in arduino.stackexchange.com/questions/188/…
TheDoctor

Risposte:


13

Sono un po 'confuso dalla tua domanda. Si chiede dove si desidera inserire le funzioni di configurazione una volta all'avvio, quindi si discute della funzione di configurazione. Ecco a cosa serve la funzione di installazione.

Come tale, la funzionalità di installazione singola va nella funzione di installazione.

FWIW, se si guarda nel file che chiama le funzioni setupe loop:

#include <Arduino.h>

int main(void)
{
    init();

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

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

A tutti gli effetti, le due opzioni sono completamente identiche. Ad ogni modo, ottieni un ciclo vuoto di attesa. Francamente, mi aspetto che le due diverse opzioni probabilmente emettano comunque lo stesso codice macchina, quindi il tutto è un problema.

Nota:
if (serialEventRun) serialEventRun();sembra essere una funzione che consente di allegare una funzione chiamata alla ricezione di dati seriali, ma se non si definisce una funzione void serialEvent(){}nel proprio codice, questa verrà compilata completamente e non sarà presente nel codice macchina prodotto.


È strano accettare una risposta che non sia (ancora) la più votata. Ma vedere la main()definizione della funzione è stato davvero utile per la mia domanda. (E, si indica un consenso con il gruppo con l'utilizzo setupinvece di loop). Grazie per l'aiuto.
apnorton,

1
@anorton - In caso di dubbi, guarda sotto le coperte. Trovo la piattaforma arduino comoda per la prototipazione, ma è in gran parte solo codice boilerplate. Capire cosa sta facendo può essere di grandissimo aiuto nel decidere come progettare qualcosa.
Connor Wolf,

6

Di solito vado con il metodo 2, ma alla fine faccio questo:

void setup() {
  //do setup stuff

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

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

void loop() {
  //do looping code
}

Con la configurazione di cui sopra consente al mio codice di essere ancora più organizzato.


la migliore risposta finora +1, grazie amico mi hai salvato!
Kyle,

5

Preferirei fortemente il Metodo 2. Se hai intenzione di aggiungere codice per gestire input, output, ecc., È facile con il Metodo 2: basta compilare loop(), ma richiede una rielaborazione / refactoring nel Metodo 1.


3

Non esiste un limite di tempo per la funzione di impostazione. Preferisco il metodo 2 perché il ciclo può essere riempito con tutto ciò che è necessario in seguito.


1

Sicuramente andare con il metodo due. Ecco a cosa serve la funzione di installazione. È anche molto più facile da leggere. Qualunque cosa nel loop()sottinteso verrà eseguita in un ciclo.


0

Come la maggior parte delle altre risposte, sceglierei il metodo 2.

Ma proverei a evitare la chiamata, dalla biblioteca di Arduino, a un vuoto loop()che fa consumare "molto" corrente a niente.

Modificare:

Come alcuni commenti hanno sottolineato, l'uso di delay()in loop()non cambierà nulla in consumo energetico.

Quindi, se desideri ridurre il consumo energetico una volta che hai setup()eseguito, dovrai giocare con le modalità di sospensione Atmel. Puoi dare un'occhiata a questo articolo che mostra come gestire le modalità di sospensione dai tuoi schizzi Arduino; fa molto di più che mettere Atmel a dormire, ma è una buona (e semplice) lettura se si desidera giocare con le modalità di sospensione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.