Setup e loop sono forniti per comodità?


13

Gli schizzi di Arduino di solito presentano una setupe loopfunzione. Queste funzioni sono fornite solo per comodità o hanno effettivamente scopi speciali? (ad es .: alcune operazioni non sono consentite o consentite in setup e loop)

Questi due pezzi di codice sono equivalenti:

Classico

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

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

Senza anello

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

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


void loop() {
}

È possibile scrivere codice senza setup o loop, fornendo, ad esempio, un mainmetodo o un altro punto di ingresso?

Risposte:


10

Quei pezzi di codice sono praticamente gli stessi.

Se guardi il codice sorgente di Arduino vedrai:

setup();

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

(Non sono sicuro di cosa serialEventRun()faccia.)

Non credo che si possa "sovraccaricare" la maindichiarazione di funzione. Si noti inoltre che la funzione principale chiama init, che ad esempio configura i timer, quindi millis()ecc. Funzionerà .


9

Queste funzioni sono fornite solo per comodità o hanno effettivamente scopi speciali?

Le librerie Arduino svolgono un po 'di pulizie domestiche loop(), legate alla gestione seriale .

Questi due pezzi di codice sono equivalenti:

Solo se non usi mai eventi seriali.

È possibile scrivere codice senza setup o loop, fornendo, ad esempio, un metodo principale o un altro punto di ingresso?

Non mentre si utilizzano rigorosamente le librerie Arduino tramite l'IDE; il linker lamenterà maindefinizioni duplicate o mancanti setupo loopdefinizioni.


2

È possibile scrivere codice senza setup o loop, fornendo, ad esempio, un metodo principale o un altro punto di ingresso?

L'ultima volta che ho usato l'IDE, potresti avere un progetto con nessun .ino/ .pdefile, solo .cppfile; dal momento che è il mutamento di .inoin a .cppche definisce la mainfunzione, se si ignora quel passaggio, è possibile definire il proprio main.

Se l'IDE non lo consente più (come ho sentito), puoi comunque fare la stessa cosa, ad esempio con una build basata su Makefile all'esterno dell'IDE, senza rinunciare alle librerie di Arduino. Le avvertenze che conosco sono:

  • Dovresti #include "Arduino.h"se vuoi accedere alle funzioni della libreria.
  • Dovresti chiamare init()se vuoi che la libreria installi le periferiche come sei abituato.
  • Dovresti inserire il serialEventcodice indicato da Gerben nel tuo mainloop se vuoi che un serialEventgestore funzioni (ma probabilmente non ti serve comunque se vuoi scrivere il tuo mainloop).

1

Gli schizzi di Arduino di solito presentano una funzione di configurazione e loop. Queste funzioni sono fornite solo per comodità o hanno effettivamente scopi speciali?

Gettano in una chiamata di funzione in più per initche inizializza i timer che lasciano millis, microse delayil lavoro senza ulteriori sforzi. A parte questo, no.

Questo codice viene compilato (ed eseguito) sotto l'IDE:

int main ()
  {
  }

In effetti l'IDE genera codice in questo modo:

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

Da allora hanno smanettato, come ha detto Ignacio Vazquez-Abrams, ma fondamentalmente puoi ignorarlo. Non c'è nulla di particolarmente speciale in setupe loop.

Puoi usare maincome ho mostrato sopra. Puoi fare tutto setupse vuoi. Puoi fare tutto loopse vuoi (se non torni mai da esso).

Ricorda, hai a che fare con un compilatore C ++ qui. Le funzioni non hanno alcun significato magico basato sui loro nomi.

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.