в то время как (1) внутри, если условно
if (!MDNS.begin("esp8266")) {
Serial.println("Error setting up MDNS responder!");
while (1) {
delay(1000);
}
}
Я знаю, что это приведет к бесконечному циклу, если условие if
никогда не будет выполнено, однако мне было интересно, приведет ли этот код к бесконечному циклу, если, скажем, после 3 итераций если
условие выполнено?
Или что-то вроде:
while(!MDNS.begin("esp8266")) {
delay(1000);
}
отличается?
Код из: https://github.com/esp8266/ Arduino/blob/master/libraries/ESP8266mDNS/examples/mDNS_Web_Server/mDNS_Web_Server.ino (строка 58)
@Alex, 👍0
Обсуждение2 ответа
Лучший ответ:
Вероятно, это тот случай, когда необходимо проверить исходный код, чтобы понять назначение бесконечного цикла. В исходном коде мы видим это:
if (!MDNS.begin("esp8266")) {
Serial.println("Error setting up MDNS responder!");
while (1) {
delay(1000);
}
}
Serial.println("mDNS responder started");
Здесь можно сделать вывод, что бесконечный цикл используется для сохранения сообщения об ошибке на последовательном мониторе. Это предотвращает объявление последующих сообщений о том, что сервер доменных имен запущен. Что может запутать пользователя.
Как упоминалось в других ответах, бесконечные циклы часто используются для преднамеренной перезагрузки процессора. Однако этот подход зависит от активно работающей функции сторожевого таймера. Функция, которая обычно не активна и даже не поддерживается в среде разработки Arduino. Возможно, потому что функция сторожевого таймера считается промежуточной темой для продвинутых.
В первом случае, когда внешнее выражение if становится истинным, код переходит в цикл while(1)
и застревает там навсегда.
Второй код отличается, поскольку цикл while
будет проверять при каждом запуске своей итерации, выполняется ли условие. Если нет, он завершится, так что это не обязательно бесконечный цикл.
Переход в бесконечный цикл, если что-то не удается инициализировать, часто происходит в мире микроконтроллеров, особенно при инициализации внешнего оборудования. Цикл сброса (перезапуск до тех пор, пока не заработает) туда по большей части не подходит, потому что зачастую это не просто ожидание освобождения ресурса. Часто это используется при серьезных проблемах, например, когда внешнее оборудование отсутствует или не работает. Представьте, что вы пытаетесь использовать внешний GPS-чип, но его там нет. Он должен быть там, так как устройство построено таким образом. Почему петля сброса должна быть лучше здесь? Проблема не исчезнет со временем. Или представьте, что инициализация не удалась из-за поломки чипа GPS. Повторная попытка подключения такого сломанного чипа может привести к поломке еще большего количества вещей. В любом случае, кто-то должен посмотреть на это, чтобы решить проблему. Оно не исчезнет само по себе.
Я бы сказал, что неудачная инициализация в приведенной выше библиотеке как раз и является такой ситуацией.
- Для loop, похоже, изменяется выполнение pow()
- Как я могу прервать задержку() при нажатии кнопки?
- Объектно-ориентированное программирование Arduino
- Объявление переменной внутри основного цикла
- hx711 и датчик нагрузки показывают 0 для калибровки
- Светодиод мигает с помощью кнопки
- Почему циклы Do While не останавливаются?
- Как повторить другое действие внутри цикла?
почему вы считаете, что условие «если» может быть выполнено более одного раза?, @jsotola
я не. Я говорю, скажем, в первой итерации это не так. пока входит цикл. тогда что происходит? есть ли какой-нибудь сценарий, в котором мы выходим из этого цикла? являются
if (условие) { while (1) }
такими же, какпока (условно) { }
, @AlexЕсли это не так, то цикл while не вводится. В первый раз, когда оператор if оказывается истинным, вы попадаете в цикл while, и код умирает там навсегда. Это очень отличается от второго, что вы написали. В этом цикле проверяется, возвращает ли функция начала значение true, а не проверка того, что 1!=0, @Delta_G
я думаю, причина, по которой я спрашивал, в том, что я не понимаю, почему первоначальный автор написал это таким образом, если только не было какой-то уловки, о которой я не знал. в основном, они просто останавливают все на неопределенный срок, что кажется мне странным, а не запускают перезагрузку устройства., @Alex
вы каким-то образом упускаете из виду тот факт, что код представляет собой всего лишь пример кода, который показывает, как кодировать веб-сервер ... код восстановления добавит ненужные процедуры, @jsotola