Код: Выделить всё
while (1) // или while (true)
{
// Этот цикл будет выполняться бесконечно
}
Посмотрите пж. здесь к примеру для внешней реализации WDTimer-а. Посмею полагать, что чисто программного ватчдога не существует в природе из-за того, что программа, которая прекратила свое выполнение, не может контролировать своё выполнение, так как она прекратила своё выполнение в однопоточной системе А если серьёзно, то или: программа циклически генерирует импульсы для аппаратного устройства как-то supervisor или таймер NE555, и каждый приход этого импульса отодвигает на время физическое дёрганье ножки МК- RESET, или наоборот используется аппаратный таймер МК WDT, механизм взаимодействия предоставляется загрузчиком (bootloader) с программной перезагрузкой AVR ассеблерной инструкцией "JMP 0" или тоже "ноги" при переполнении (прерывание!). Читал, но к сожалению не проверял, что заставить МК войти в бесконечный цикл можно некорректной арифметической операцией как-то деление числа на ноль (при условии, что этот ноль не константа и т.о. не может определиться на этапе компиляции). Но врядли такой случай, или описаный выше способ с помощью нескончаемого цикла While и goto, или ожидание МК в популярном интерфейсе I2C подтверждения от приемника АСК-а (при потере связи, не реализованы в Ардуино ядре функции повторного старта или досрочного стопа спецификации интерфейса и часто совсем незаслуженно ругают из-за этого I2С) стоит называть зависанием, так как программа фактически выполняется, системные аппаратные таймеры продолжают "тикать", прерывания работают. Эти случаи описаны как Infinite loop или ErrorsLoop. А сторожевой таймер в МК AVR представляет собой независимый аппаратный асинхронный блок, тактирующийся от отдельного внутреннего RC генератора! Другое дело, когда происходит переполнение стэка, переполнение RAM и даже переполнение массива в функции. В С/С++ обязанность контроля колличества элементов масива возложена полностью на программиста, в функцию передаётся адрес и можно испортить данные по соседнему адресу. Или потеря/некорректность записи/хранения/адресации данных из-за сбоя по питанию(см. RAM Data Retention Voltage и/или Brown-out Detector, что не имеет отношения к аппаратному модулю WDT). Т.е.выполнение программы просто становится невозможным- это точно висит . IMHO, если ошибаюсь - намекните п.ж.- старался объяснить очень распространённые заблуждения попроще:yes:
И такой метод работает с внешним таймером NE555 или супрессором, извините супервизором (очепятка) , который не получит вовремя импульс из програмного генератора (не на прерываниях) или длительного delay() для подзарядки времязадающего конденсатора и тупо закоротит ногу МК RST.ivansidor012 писал(а): ↑18.07.2021{, 17:02}ключевое: рестарт по вачдогу. Она сама выйдет из цикла с ребутом
потому что это разные камни, задачи и методы. Espressif скрывает исходники ESP (SDK), потому о ихней собаке можно только догадываться на основании обобщения наблюдений поведения чипа, в отличии от АВР для которых есть AN_2551. Для поддержания сетевого соединения вероятно необходим периодический пинг. И он находится (очевидно ) в прерывании высшего приоритета NMI. Ссылки даю. Прошу обратить внимание на то как модуль Wi-Fi вызывает ребут ESP8266 здесь, цитирую ув.автора "...и когда отключить WiFi, то этого косяка нет..." и здесь: "WiFi и TCP/IP функции библиотек SDK имеют возможность обработать все события в очереди после завершения каждого цикла вашей функции void loop() или во время выполнения delay()...".
Теперь, надеюсь, уже не на столько категорически нет? Спасибо, приятно с Вами вести диалог!
Так обычным блинком - для Uno, Nano
Код: Выделить всё
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
while (1) // или while (true)
{
// Этот цикл будет выполняться бесконечно
}
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Anydy, ув.Андрей, полностью согласен, потому, что ... тоже не проверял , и прикупил давненько несколько разных супервизоров в т.ч. с енергонезависимой памятью для логирования событий и контролем питания.
Попробую наверное усугубить Ваши сомнения: нет не "мёртво" и даже скорее не висит?, а выполняет в штатном порядке программу в бесконечном цикле и при этом даже не выходя из... слушает кнопку и отрабатывает её нажатия правда в прерывании. Ничего фатального! Немножко (в Си) изменил и дополнил скетч ув. Андрея выше, что-бы можно было