Для удобства предусмотрены настройка и цикл?

13

Эскизы Arduino обычно имеют функцию setupи loopфункцию. Предоставляются ли эти функции только для удобства или они действительно имеют специальные цели? (например: некоторые операции запрещены или разрешены в настройке и цикле)

Являются ли эти две части кода эквивалентными:

классический

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

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

Без петли

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

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


void loop() {
}

Можно ли писать код без установки или цикла, предоставляя, например, mainметод или другую точку входа?

Sebazzz
источник

Ответы:

10

Эти фрагменты кода практически одинаковы.

Если вы посмотрите на исходный код Arduino, вы увидите:

setup();

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

(Я не уверен, что serialEventRun()делает.)

Я не думаю, что вы можете «перегрузить» mainобъявление функции. Также обратите внимание, что вызовы основных функций init, которые, например, настраивают таймеры и т. millis()Д., Будут работать.

Gerben
источник
9

Предоставляются ли эти функции только для удобства или они действительно имеют специальные цели?

Библиотеки Arduino занимаются домашним хозяйством loop(), связанным с последовательной обработкой .

Являются ли эти две части кода эквивалентными:

Только если вы никогда не используете последовательные события.

Можно ли написать код без установки или зацикливания, предоставляя, например, основной метод или другую точку входа?

Не при строгом использовании библиотек Arduino через IDE; компоновщик будет жаловаться либо на дубликаты mainопределений, либо на отсутствие setupили loopопределения.

Игнасио Васкес-Абрамс
источник
2

Можно ли написать код без установки или зацикливания, предоставляя, например, основной метод или другую точку входа?

В последний раз, когда я использовал IDE, у вас мог быть проект без .ino/ .pdefile, только .cppфайлы; так как функция определяет вход .inoв, .cppкоторый определяет mainфункцию, если вы пропустите этот шаг, вы можете определить свой собственный main.

Если IDE больше не позволяет это (как я слышал), вы все равно можете сделать то же самое, например, с помощью сборки на основе Makefile вне IDE, не отказываясь от библиотек Arduino. Я знаю о следующих предостережениях:

  • Вы должны, #include "Arduino.h"если вы хотите получить доступ к функциям библиотеки.
  • Вам следует позвонить, init()если вы хотите, чтобы библиотека настраивала периферийные устройства так, как вы привыкли.
  • Вы должны поместить serialEventкод, на который указывает Гербен, в ваш основной цикл, если вы хотите, serialEventчтобы выполнялся обработчик (но вам, вероятно, это все равно не нужно, если вы хотите написать свой собственный основной цикл).
Hobbs
источник
1

Эскизы Arduino обычно имеют функцию настройки и петли. Предоставляются ли эти функции только для удобства или они действительно имеют специальные цели?

Они добавляют дополнительный вызов функции, initкоторый инициализирует таймеры, которые позволяют millis, microsи delayработают без дополнительных усилий. Кроме этого нет.

Этот код компилируется (и выполняется) в среде IDE:

int main ()
  {
  }

По сути, среда IDE генерирует такой код:

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

С тех пор они возились с этим, как сказал Игнасио Васкес-Абрамс, но в принципе это можно игнорировать. Там нет ничего особенного о setupи loop.

Вы можете использовать, mainкак я показал выше. Вы можете сделать все, setupесли хотите. Вы можете сделать все, loopесли хотите (если вы никогда не вернетесь с этого).

Помните, что вы имеете дело с компилятором C ++ здесь. Функции не имеют магического значения, основанного на их именах.

Ник Гаммон
источник