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

В эскизах 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 или другую точку входа?

12 голосов | спросил Sebazzz 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 03 Sep 2014 22:11:50 +0400 2014, 22:11:50

4 ответа


10

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

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

setup();

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

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

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

ответил Gerben 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 03 Sep 2014 22:26:03 +0400 2014, 22:26:03
9
  

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

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

  

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

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

  

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

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

ответил Ignacio Vazquez-Abrams 3 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 03 Sep 2014 22:28:20 +0400 2014, 22:28:20
2
  

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

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

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

  • Вам следует #include "Arduino.h", если вы хотите получить доступ к библиотечным функциям.
  • Вы должны вызвать init(), если вы хотите, чтобы библиотека настраивала периферийные устройства так, как вы привыкли.
  • Вы должны поместить код serialEvent, который Gerben указывает на ваш mainloop, если вы хотите, чтобы обработчик serialEvent запускался (но вам, вероятно, это не нужно, так или иначе, если вы хотите написать свой собственный mainloop).
ответил hobbs 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 04 Sep 2014 06:52:24 +0400 2014, 06:52:24
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 ++. Функции не имеют какого-либо магического значения, основанного на их именах.

ответил Nick Gammon 29 +03002015-10-29T09:40:56+03:00312015bEurope/MoscowThu, 29 Oct 2015 09:40:56 +0300 2015, 09:40:56

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132