Ожидаемое поведение бесконечной настройки Arduino

#arduino

#arduino

Вопрос:

Я предполагаю, что если код никогда не покинет setup() all, он просто застрянет там навсегда, но (возможно, код не соответствует тому, что я наблюдаю), это похоже на что-то другое (перезагрузка?). Итак, существуют ли какие-либо сбои, которые должны срабатывать в случае, если установка застряла в самом цикле?

Комментарии:

1. Вы написали код, чтобы повесить его в настройках? Вы пишете код. Вам не нужно что-то еще, чтобы сообщить вам о том, что выполнение будет заблокировано там. В чем проблема? Каков фактический код? Ваш вопрос слишком расплывчатый, чтобы диагностировать что-либо, как написано. Добавьте детали, и я сниму понижающий голос.

2. Если я правильно понял ваш вопрос, нет, вы застряли в setup ()…

3. Или вы спрашиваете, что произойдет, если вы сделаете это специально? В этом случае ответ — ничего. Нет причин, по которым программа установки должна завершаться. Это просто обычная функция, как и все остальные.

4. Позвольте мне перефразировать. Я наблюдаю некоторый код, который никогда не должен покидать setup(), который, похоже, действительно это делает. Итак, было два варианта: 1. Я смотрю на неправильный код (возможно) 2. В ОС Arduino есть контракт, в котором говорится, что если вы не выйдете из настройки через 30 секунд, плата вызовет прерывание или перезагрузка закончится как 1. Кто-то не загрузил последнюю версию исходного кода прошивки. Я не смог найти никакой официальной документации по этому поводу. Теперь я знаю

Ответ №1:

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

Важно понимать, что setup и loop — это обычные функции, такие же, как и любые другие. Реальной точкой входа программы Arduino (или любой программы на C или C ) является функция main() . По какой-то причине Arduino подумал, что было бы полезно скрыть это от вас и просто предоставить вам парадигму настройки и цикла. Я думаю, это потому, что в большинстве встроенных проектов на маленьких микроконтроллерах основная функция записывается с бесконечным циклом в конце выполнения основной программы.

Вот функция main() для всех ваших программ Arduino. Это то, что на самом деле является точкой входа для вашей программы.

 int main(void)
{
    init();

    initVariant();

#if defined(USBCON)
    USBDevice.attach();
#endif
    
    setup();
    
    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }
        
    return 0;
}
  

Здесь вы можете видеть, что сначала он вызывает функции init() и initVariant() . Это функции из ядра, которые настраивают все аппаратные средства, такие как таймеры, регистры ввода и вывода и прочее. Вот почему плохо иметь аппаратные средства, такие как digitalWrite или что-то в конструкторе класса, потому что они могут быть вызваны в глобальном масштабе и запущены до того, как эти две функции подготовят плату.

Далее вы видите эту строку с UsbDevice.attach(); и это для обработки USB-соединения на платах с помощью встроенных USB-контроллеров, таких как Leonardo.

И, наконец, вы видите, что он вызывает функцию setup один раз, а затем вызывает функции loop и serialEventRun в бесконечном цикле for . Я не на 100% понимаю, почему цикл for вместо цикла while (1), но именно так они это делают.

Итак, вы можете видеть, что если ваш код никогда не выходит из настройки, то все, что происходит, это то, что вы никогда не доходите до точки в программе, где вы вызываете цикл. Больше ничего. Вполне допустимо поставить while (1) в конце настройки и остановить контроллер, если у вас есть что-то, что вы хотите запустить только один раз. Вы даже можете поместить тот же самый бесконечный цикл со всем кодом, который вы бы поместили в функцию цикла. Немного избыточно, но это ничего не повредит.

Комментарии:

1. Это верно с функциональной точки зрения. Конечный результат может быть тем же, если выполнение никогда не выходит из setup() . Однако самой большой проблемой встроенного программного обеспечения является отладка или добавление чего-либо в код месяцами позже. Поэтому лучше всего не делать что-то другое без уважительной причины. Я не вижу причин создавать бесконечный цикл в setup(), поскольку loop() существует. Однако это может послужить цели во время отладки.