¿Se proporciona configuración y bucle para mayor comodidad?

13

Los bocetos de Arduino suelen presentar una setupy una loopfunción. ¿Estas funciones solo se proporcionan por conveniencia o realmente tienen propósitos especiales? (p. ej .: algunas operaciones están prohibidas o permitidas en la configuración y el bucle)

¿Son equivalentes estas dos piezas de código?

Clásico

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

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

Sin bucle

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

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


void loop() {
}

¿Es posible escribir código sin configuración o bucle, proporcionando, por ejemplo, un mainmétodo u otro punto de entrada?

Sebazzz
fuente

Respuestas:

10

Esas piezas de código son más o menos lo mismo.

Si observa el código fuente de Arduino , verá:

setup();

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

(No estoy seguro de lo que serialEventRun()hace)

No creo que pueda 'sobrecargar' la maindeclaración de la función. También tenga en cuenta que la función principal llama init, por ejemplo, configura los temporizadores, por lo que millis()etc. funcionará.

Gerben
fuente
9

¿Estas funciones solo se proporcionan por conveniencia o realmente tienen propósitos especiales?

Las bibliotecas Arduino hacen un poco de limpieza loop(), relacionada con el manejo en serie .

¿Son equivalentes estas dos piezas de código?

Solo si nunca usa eventos en serie.

¿Es posible escribir código sin configuración o bucle, proporcionando, por ejemplo, un método principal u otro punto de entrada?

No mientras usa estrictamente las bibliotecas Arduino a través del IDE; el enlazador se quejará de cualquiera de duplicados maindefiniciones o de falta setupo loopdefiniciones.

Ignacio Vazquez-Abrams
fuente
2

¿Es posible escribir código sin configuración o bucle, proporcionando, por ejemplo, un método principal u otro punto de entrada?

La última vez que usé el IDE, podría tener un proyecto sin archivos .ino/ .pdesolo .cpparchivos; dado que es el cambio de .inoun a lo .cppque define la mainfunción, si omite ese paso, puede definir el suyo main.

Si el IDE ya no permite esto (como he escuchado), aún puede hacer lo mismo con, por ejemplo, una compilación basada en Makefile fuera del IDE, sin renunciar a las bibliotecas Arduino. Las advertencias que conozco son:

  • Debería #include "Arduino.h"si desea acceder a las funciones de la biblioteca.
  • Debe llamar init()si desea que la biblioteca configure los periféricos de la forma en que está acostumbrado.
  • Debería poner el serialEventcódigo que Gerben señala en su bucle principal si desea serialEventque se ejecute un controlador (pero probablemente no lo necesite de todos modos si desea escribir su propio bucle principal).
hobbs
fuente
1

Los bocetos de Arduino generalmente presentan una función de configuración y bucle. ¿Estas funciones solo se proporcionan por conveniencia o realmente tienen propósitos especiales?

La tiran en una llamada a una función extra para initque inicializa los contadores de tiempo que dejan pasar millis, microsy delayel trabajo sin más esfuerzo. Aparte de eso, no.

Este código se compila (y se ejecuta) bajo el IDE:

int main ()
  {
  }

Efectivamente, el IDE genera código como este:

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

Han jugado con él desde entonces, como dijo Ignacio Vázquez-Abrams, pero básicamente puedes ignorar eso. No hay nada particularmente especial sobre setupy loop.

Puedes usar maincomo te mostré arriba. Puedes hacer todo setupsi quieres. Puede hacer todo loopsi lo desea (si nunca regresa de él).

Recuerde, aquí está tratando con un compilador de C ++. Las funciones no tienen un significado mágico en función de sus nombres.

Nick Gammon
fuente