La configuration et la boucle sont-elles fournies pour plus de commodité?

13

Les croquis Arduino comportent généralement une fonction setupet loop. Ces fonctions sont-elles fournies uniquement pour des raisons de commodité ou ont-elles en fait des objectifs particuliers? (par exemple: certaines opérations sont-elles interdites ou autorisées dans la configuration et la boucle)

Ces deux morceaux de code sont-ils équivalents:

Classique

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

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

Sans boucle

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

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


void loop() {
}

Est-il possible d'écrire du code sans configuration ni boucle, en fournissant, par exemple, une mainméthode ou un autre point d'entrée?

Sebazzz
la source

Réponses:

10

Ces morceaux de code sont à peu près les mêmes.

Si vous regardez le code source Arduino, vous verrez:

setup();

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

(Je ne sais pas trop ce qui se serialEventRun()passe.)

Je ne pense pas que vous puissiez «surcharger» la maindéclaration de fonction. Notez également que la fonction principale appelle init, ce qui, par exemple, configure les temporisateurs, donc millis()etc. fonctionnera.

Gerben
la source
9

Ces fonctions sont-elles fournies uniquement pour des raisons de commodité ou ont-elles en fait des finalités particulières?

Les bibliothèques Arduino font un peu de ménage avec loop(), liées à la gestion en série .

Ces deux morceaux de code sont-ils équivalents:

Seulement si vous n'utilisez jamais d'événements en série.

Est-il possible d'écrire du code sans configuration ni boucle, en fournissant, par exemple, une méthode principale ou un autre point d'entrée?

Pas en utilisant strictement les bibliothèques Arduino via l'IDE; l'éditeur de liens se plaindra soit en double des maindéfinitions ou des manquants setupou des loopdéfinitions.

Ignacio Vazquez-Abrams
la source
2

Est-il possible d'écrire du code sans configuration ni boucle, en fournissant, par exemple, une méthode principale ou un autre point d'entrée?

La dernière fois que j'ai utilisé l'IDE, vous pouviez avoir un projet sans .ino/ .pdefichier, uniquement des .cppfichiers; puisque c'est la transformation de la .inoen un .cppqui définit la mainfonction, si vous contournez cette étape, vous pouvez définir la vôtre main.

Si l'IDE ne permet plus cela (comme je l'ai entendu), vous pouvez toujours faire la même chose avec, par exemple, une construction basée sur Makefile en dehors de l'IDE, sans renoncer aux bibliothèques Arduino. Les mises en garde que je connais sont:

  • Vous devriez le faire #include "Arduino.h"si vous souhaitez accéder aux fonctions de la bibliothèque.
  • Vous devez appeler init()si vous souhaitez que la bibliothèque configure les périphériques comme vous en avez l'habitude.
  • Vous devriez mettre le serialEventcode indiqué par Gerben dans votre boucle principale si vous voulez qu'un serialEventgestionnaire s'exécute (mais vous n'en aurez probablement pas besoin de toute façon si vous voulez écrire votre propre boucle principale).
Hobbs
la source
1

Les croquis Arduino comportent généralement une fonction de configuration et de boucle. Ces fonctions sont-elles fournies uniquement pour des raisons de commodité ou ont-elles en fait des finalités particulières?

Ils jettent dans un appel de fonction supplémentaire pour initinitialisant les minuteries qui permettent millis, microset le delaytravail sans effort. A part ça, non.

Ce code compile (et s'exécute) sous l'IDE:

int main ()
  {
  }

En fait, l'EDI génère du code comme ceci:

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

Ils l'ont tripoté depuis lors, comme l'a dit Ignacio Vazquez-Abrams, mais fondamentalement, vous pouvez l'ignorer. Il n'y a rien de particulièrement spécial dans setupet loop.

Vous pouvez utiliser maincomme je l'ai montré ci-dessus. Vous pouvez tout faire setupsi vous le souhaitez. Vous pouvez tout faire loopsi vous le souhaitez (si vous n'en revenez jamais).

N'oubliez pas que vous avez affaire à un compilateur C ++ ici. Les fonctions n'ont pas de signification magique en fonction de leurs noms.

Nick Gammon
la source