ivansidor012,
Спасибо, что делитесь своим опытом, но я как-то не увидел противоречий в моих словах и Ваших. Извините, не программист и тем более не ассеблерщик и прошу простить и указать мои заблуждения. Но я же привёл ссылки на материалы, которые использовал. Потому и пишу,
1) что бесконечный (не путать с основным циклом Loop()) цикл- Infinite loop (конечно же если он не находится в обработчике высокоприоритетного прерывания) не может помешать аппаратному штатному WatchDog AVR, который выполняется в прерывании (основного цикла) от переполнения WatchDogTimer-а, как самостоятельного
асинхронного модуля который запишет флаг и лог срабатывания сторожевой собаки, в зависимости от настроек "дергнет" ногой RST или ставит курсор в начало адресного пространства (0 адрес условно), где находится загрузчик. Ведь сброс WDтаймера тоже происходит от программного импульса, до генерации которого не дошла очередь за заданное время из-за "Infinite loop"т.е.расстягивания времени основного цикла. Вы это подтвердили
ivansidor012 писал(а): ↑18.07.2021{, 17:02}
ключевое: рестарт по вачдогу. Она сама выйдет из цикла с ребутом
И такой метод работает с внешним таймером NE555 или
супрессором, извините супервизором (очепятка)
, который не получит вовремя импульс из програмного генератора (не на прерываниях) или длительного delay() для подзарядки времязадающего конденсатора и тупо закоротит ногу МК RST.
2) Я спросил об
Labu559 писал(а): ↑18.07.2021{, 02:33}
систему AVR/ESP/ESP32
потому что это разные камни, задачи и методы. Espressif скрывает исходники ESP (SDK), потому о ихней собаке можно только догадываться на основании обобщения наблюдений поведения чипа, в отличии от АВР для которых есть
AN_2551. Для поддержания сетевого соединения вероятно необходим периодический пинг. И он находится (очевидно
) в прерывании высшего приоритета NMI. Ссылки даю. Прошу обратить внимание на то как модуль Wi-Fi вызывает
ребут ESP8266 здесь, цитирую ув.автора "...и когда отключить WiFi, то этого косяка нет..." и
здесь: "WiFi и TCP/IP функции библиотек SDK имеют возможность обработать все события в очереди после завершения каждого цикла вашей функции void loop() или во время выполнения delay()...".
3) Понижение питания АВР ниже порога сохранения данных в оперативке обрабатывает аппаратный модуль детектора коричневого выхода (Brown-out, дословный перевод). И работает он чуть по другому- делает и удерживает ресет пока напряжение питания не прийдёт в норму.
4) Лог, (отладочная информация) который выдает загрузчик ESP при старте, подозреваю не конкретизирует посредством какого первичного события (модуля Wi-Fi или Brown-out Detector, и т.п.) был ресет, возможно первые вызывают срабатывание собаки или есть её частью, не знаю. Опубликованый лог есть последствием, а не причиной перезагрузки, с её указанием: аппаратный WDT (cause:4). Для ESP в бесконечный цикл нужно наверное нужно вставлять delay(), чтобы отсечь перезагрузку Wi-Fi модулем. См. пункт ниже.
5) Здесь Ваш лог и
обсуждение на русском.
6) Во всех уроках по прерываниям пишут, что нельзя пихать в обработчик прерывания функции, а только флаг, который выполнится в основном цикле и сбросится по выполнении, особенно если в обработчике прерываний запрещаются другие событийные прерывания.
Теперь, надеюсь, уже не на столько категорически нет?
Спасибо, приятно с Вами вести диалог!
Исправил опечатку, добавил документ.