A configuração e o loop são fornecidos por conveniência?

13

Os esboços do Arduino geralmente apresentam uma função setupe loop. Essas funções são fornecidas apenas por conveniência ou têm realmente fins especiais? (por exemplo: algumas operações são proibidas ou permitidas na configuração e no loop)

Esses dois pedaços de código são equivalentes:

Clássico

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

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

Sem laço

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

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


void loop() {
}

É possível escrever código sem configuração ou loop, fornecendo, por exemplo, um mainmétodo ou outro ponto de entrada?

Sebazzz
fonte

Respostas:

10

Essas partes do código são praticamente as mesmas.

Se você olhar o código fonte do Arduino, verá:

setup();

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

(Não sei o que serialEventRun()faz.)

Eu não acho que você pode 'sobrecarregar' a maindeclaração da função. Observe também que as principais chamadas de função init, que por exemplo configuram os temporizadores, millis()etc., funcionarão.

Gerben
fonte
9

Essas funções são fornecidas apenas por conveniência ou têm realmente fins especiais?

As bibliotecas do Arduino fazem um pequeno trabalho de limpeza loop(), relacionado ao manuseio em série .

Esses dois pedaços de código são equivalentes:

Somente se você nunca usar eventos seriais.

É possível escrever código sem configuração ou loop, fornecendo, por exemplo, um método principal ou outro ponto de entrada?

Não enquanto estiver usando estritamente as bibliotecas do Arduino via IDE; o vinculador reclamará de maindefinições duplicadas ou de falta setupou loopdefinições.

Ignacio Vazquez-Abrams
fonte
2

É possível escrever código sem configuração ou loop, fornecendo, por exemplo, um método principal ou outro ponto de entrada?

A última vez que usei o IDE, você poderia ter um projeto sem .ino/ .pdefile, apenas .cpparquivos; como é a manipulação do .inoem um .cppque define a mainfunção, se você ignorar essa etapa, poderá definir o seu próprio main.

Se o IDE não permitir mais isso (como eu ouvi), você ainda poderá fazer o mesmo com, por exemplo, uma compilação baseada em Makefile fora do IDE, sem abrir mão das bibliotecas do Arduino. As advertências que conheço são:

  • Você deve #include "Arduino.h"se quiser acessar as funções da biblioteca.
  • Você deve ligar init()se quiser que a biblioteca configure periféricos da maneira que está acostumado.
  • Você deve colocar o serialEventcódigo que o Gerben aponta no seu mainloop se quiser que um serialEventmanipulador seja executado (mas provavelmente você não precisará disso de qualquer maneira se quiser escrever seu próprio mainloop).
hobbs
fonte
1

Os esboços do Arduino geralmente apresentam uma função de configuração e loop. Essas funções são fornecidas apenas por conveniência ou têm realmente fins especiais?

Eles jogam em uma chamada de função extra para initque inicializa os temporizadores que permitem millis, microse delaytrabalho sem esforço adicional. Fora isso, não.

Esse código compila (e executa) no IDE:

int main ()
  {
  }

Efetivamente, o IDE gera código como este:

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

Eles brincaram com isso desde então, como Ignacio Vazquez-Abrams disse, mas basicamente você pode ignorar isso. Não há nada de especial sobre setupe loop.

Você pode usar maincomo eu mostrei acima. Você pode fazer tudo setupse quiser. Você pode fazer tudo loopse quiser (se nunca mais voltar).

Lembre-se, você está lidando com um compilador C ++ aqui. As funções não têm algum significado mágico com base em seus nomes.

Nick Gammon
fonte