Написание элегантных приложений для Arduino

Поскольку я работал на C, меня учили, что узкие циклы, которые просто сжигают ресурсы процессора, нежелательны.

Есть ли руководства по стилю программирования для Arduino? Является ли обычной практикой просто позволить циклу повторяться как замкнутый цикл навсегда?

, 👍1

Обсуждение

Ваш проект питается от батареек или от сети?, @Edgar Bonet

Сеть @EdgarBonet, мне просто интересно, можно ли сделать секцию цикла более элегантной или это всегда просто узкая петля, похожая на while (1)., @Woodstock


3 ответа


Лучший ответ:

3

Путь выполнения микроконтроллера представляет собой замкнутый цикл, нравится вам это или нет.

Если вы возьмете ЦП и подключите его к пустой памяти, ЦП будет выполнять каждую пустую ячейку по очереди и возвращаться к началу памяти, когда она достигает конца (при условии, что пустые ячейки памяти равны NOP и покрывают все пространство памяти). ).

Без операционной системы, без планировщика, без выполнения какого-либо конкретного кода ЦП всегда что-то выполняет.

ЦП перестает выполняться только тогда, когда вы вручную переводите его в спящий режим, чтобы его разбудил какой-либо внешний источник (например, таймер или датчик, отправляющий сигнал прерывания). Обычно вы делаете это только для снижения энергопотребления.

На Arduino функция loop() фактически выполняется из цикла while(1).

На микроконтроллерах, когда main() завершает работу или вы вызываете exit(), прерывания просто отключаются и происходит переход к while(1) петля.

,

3

В многопроцессорной системе, такой как ваш обычный рабочий стол, у вас обычно намного больше процессов, чем логические процессоры. При программировании таких систем вы поэтому следует избегать сжигания большего количества циклов ЦП, чем необходимо. Вместо, когда вашей программе нечего делать, она должна просто заснуть и оставить процессор, доступный для других процессов.

На Arduino одновременно работает только одна программа. Это тогда не так уж полезно держать процессор в режиме ожидания. Кроме того, рассеиваемая мощность настолько низкий, что вы не заметите, как микроконтроллер станет даже слегка теплый. Дополнительная сложность засыпания и выхода из него Поэтому режим не так полезен. Только при работе от батареек позаботьтесь об экономии каждого возможного миллиампера: затем узнайте о сне режимы становятся полезными.

,

Кроме того, с совместной многозадачностью в системе реального режима, такой как Arduino, вы ХОТИТЕ, чтобы основной цикл приложения работал как можно быстрее (наиболее плотный цикл). Таким образом, он проверяет и реагирует на входные данные как можно быстрее. Если вы пишете код прерывания, вы хотите, чтобы ЭТО закончилось как можно быстрее, чтобы вернуться к этому жесткому основному циклу., @Duncan C


1

В этом разница между программированием встроенных систем и (многими, но не всеми) другими типами программирования. Встроенная система обычно представляет собой некий контроллер и должна реагировать на один или несколько видов событий. Три типичных способа добиться этого:

  • использовать какую-то операционную систему для координации событий и код, управляющий каждым из них;
  • написать подпрограммы обслуживания прерываний (ISR) для управления событиями и отправки в код, который ими управляет;
  • для частого опроса событий и отправки кода для управления ими.

На таких маленьких процессорах, как AVR, память данных, а иногда и память инструкций являются дефицитными ресурсами, а операционная система обычно слишком дорогая (с точки зрения потребности в памяти) для большинства из них. На ATtinys забудьте об этом. В Uno, может быть, вроде как, но память будет довольно серьезным ограничением. В Megas вы можете с этим справиться.

Программирование ISR может быть сложным для написания и определенно более сложным для отладки(!). Это не исключено, и это может быть оправдано в системе, которая должна быть очень отзывчивой — вспомните автомобильную АБС-тормозную систему, систему контроля тяги и систему дистанционного управления. С другой стороны, такие системы должны быть правильными.

Опрос проще всего писать и отлаживать. Вы вызываете каждую подсистему (код) в тесном цикле (и вот ваш ответ: «да, пусть повторяется»), что дает каждой из них возможность оценить, нужно ли ей действовать, и сделать это. Это тот случай, когда циклы записи не имеют значения, но при этом система становится более отзывчивой.

На своих занятиях для любителей я учу этому; это также то, что используют больше всего. Я называю это "может быть" (и писал об этом здесь в ответ на другой вопрос). В loop() я ничего не делаю, а только по очереди вызываю ряд функций, каждая из которых делает:

   {
      if не нужно действовать сейчас,
         return;
      else {
         делать то, что нужно сделать - быстро!;
         return;
      }
   }
,

спасибо Джей Роберт!, @Woodstock