Как "подвесить" МК?
Как "подвесить" МК?
Здравствуйте! Хочу проверить программный вачдог. Помогите советом, как можно гарантированно заставить зависнуть микроконтроллер, который использует внутреннюю синхронизацию (Attiny без кварца, или например esp)? Способ с уменьшением питания не подходит. Создавать помеху тоже не очень. Есть ли еще способы?
Как "подвесить" МК?
Создать блок пользователя, в нем в loop
https://ravesli.com/urok-67-tsikl-while/
Всё ...МК ушел в бесконечный цикл
А вообще то программная собачка нифига не работает.....только железная!
Код: Выделить всё
while (1) // или while (true)
{
// Этот цикл будет выполняться бесконечно
}
Всё ...МК ушел в бесконечный цикл
А вообще то программная собачка нифига не работает.....только железная!
-
- Лейтенант
- Сообщения: 516
- Зарегистрирован: 25 фев 2018, 08:48
- Откуда: Оренбург
- Имя: Александр
Как "подвесить" МК?
Подвесить МК - программно.
Перегрузить аппаратно через внешний таймер на любой микрухе. К примеру 555 или по внешнему сигналу.
Перегрузить аппаратно через внешний таймер на любой микрухе. К примеру 555 или по внешнему сигналу.
Как "подвесить" МК?
Посмотрите пж. здесь к примеру для внешней реализации WDTimer-а. Посмею полагать, что чисто программного ватчдога не существует в природе из-за того, что программа, которая прекратила свое выполнение, не может контролировать своё выполнение, так как она прекратила своё выполнение в однопоточной системеAviacode писал(а): 16 июл 2021, 13:27 Хочу проверить программный вачдог. Помогите советом, как можно гарантированно заставить зависнуть микроконтроллер,


Уточните для сообщества способ аппаратного всё-таки WDT, который Вы применяете и систему AVR/ESP/ESP32.
-
- Лейтенант
- Сообщения: 310
- Зарегистрирован: 10 сен 2020, 14:37
- Имя: Иван
- Благодарил (а): 3 раза
- Поблагодарили: 5 раз
Как "подвесить" МК?
[ref]Labu559[/ref],
да нет же
Отправлено спустя 4 минуты 11 секунд:
<<<stack<<<
ets Jan 8 2013,rst cause:4, boot mode:(3,6)
wdt reset
load 0x4010f000, len 1392, room 16
tail 0
chksum 0xd0
csum 0xd0
v3d128e5c
~ld
да нет же
Отправлено спустя 4 минуты 11 секунд:
<<<stack<<<
ets Jan 8 2013,rst cause:4, boot mode:(3,6)
wdt reset
load 0x4010f000, len 1392, room 16
tail 0
chksum 0xd0
csum 0xd0
v3d128e5c
~ld
-
- Лейтенант
- Сообщения: 310
- Зарегистрирован: 10 сен 2020, 14:37
- Имя: Иван
- Благодарил (а): 3 раза
- Поблагодарили: 5 раз
-
- Лейтенант
- Сообщения: 310
- Зарегистрирован: 10 сен 2020, 14:37
- Имя: Иван
- Благодарил (а): 3 раза
- Поблагодарили: 5 раз
Как "подвесить" МК?
понятно что нельзя зависать в циклах надолго.
То есть нужно проверить то, что нужно и вывалиться из loop.
Иначе будет отваливаться WiFi, а если дольше (чем сколько в мсек?) не выходить из loop - будет рестарт по вотчдогу.
То есть нужно проверить то, что нужно и вывалиться из loop.
Иначе будет отваливаться WiFi, а если дольше (чем сколько в мсек?) не выходить из loop - будет рестарт по вотчдогу.
-
- Лейтенант
- Сообщения: 310
- Зарегистрирован: 10 сен 2020, 14:37
- Имя: Иван
- Благодарил (а): 3 раза
- Поблагодарили: 5 раз
-
- Лейтенант
- Сообщения: 310
- Зарегистрирован: 10 сен 2020, 14:37
- Имя: Иван
- Благодарил (а): 3 раза
- Поблагодарили: 5 раз
-
- Лейтенант
- Сообщения: 310
- Зарегистрирован: 10 сен 2020, 14:37
- Имя: Иван
- Благодарил (а): 3 раза
- Поблагодарили: 5 раз
Как "подвесить" МК?
и отправить ее (последнюю плату в луп) до момента получения флагов со всех выполненных выше плат.
т.е. while на самой нижней пока не нижняя не получит все флаги с верхних плат
вот и это и работает. это и есть вачдог на есп.
т.е. while на самой нижней пока не нижняя не получит все флаги с верхних плат
вот и это и работает. это и есть вачдог на есп.
Как "подвесить" МК?
[ref]ivansidor012[/ref],
Спасибо, что делитесь своим опытом, но я как-то не увидел противоречий в моих словах и Ваших. Извините, не программист и тем более не ассеблерщик и прошу простить и указать мои заблуждения. Но я же привёл ссылки на материалы, которые использовал. Потому и пишу,
1) что бесконечный (не путать с основным циклом Loop()) цикл- Infinite loop (конечно же если он не находится в обработчике высокоприоритетного прерывания) не может помешать аппаратному штатному WatchDog AVR, который выполняется в прерывании (основного цикла) от переполнения WatchDogTimer-а, как самостоятельного асинхронного модуля который запишет флаг и лог срабатывания сторожевой собаки, в зависимости от настроек "дергнет" ногой RST или ставит курсор в начало адресного пространства (0 адрес условно), где находится загрузчик. Ведь сброс WDтаймера тоже происходит от программного импульса, до генерации которого не дошла очередь за заданное время из-за "Infinite loop"т.е.расстягивания времени основного цикла. Вы это подтвердили
, который не получит вовремя импульс из програмного генератора (не на прерываниях) или длительного delay() для подзарядки времязадающего конденсатора и тупо закоротит ногу МК RST.
2) Я спросил об
) в прерывании высшего приоритета 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) Во всех уроках по прерываниям пишут, что нельзя пихать в обработчик прерывания функции, а только флаг, который выполнится в основном цикле и сбросится по выполнении, особенно если в обработчике прерываний запрещаются другие событийные прерывания.
Спасибо, приятно с Вами вести диалог!
Исправил опечатку, добавил документ.
Спасибо, что делитесь своим опытом, но я как-то не увидел противоречий в моих словах и Ваших. Извините, не программист и тем более не ассеблерщик и прошу простить и указать мои заблуждения. Но я же привёл ссылки на материалы, которые использовал. Потому и пишу,
1) что бесконечный (не путать с основным циклом Loop()) цикл- Infinite loop (конечно же если он не находится в обработчике высокоприоритетного прерывания) не может помешать аппаратному штатному WatchDog AVR, который выполняется в прерывании (основного цикла) от переполнения WatchDogTimer-а, как самостоятельного асинхронного модуля который запишет флаг и лог срабатывания сторожевой собаки, в зависимости от настроек "дергнет" ногой RST или ставит курсор в начало адресного пространства (0 адрес условно), где находится загрузчик. Ведь сброс WDтаймера тоже происходит от программного импульса, до генерации которого не дошла очередь за заданное время из-за "Infinite loop"т.е.расстягивания времени основного цикла. Вы это подтвердили
И такой метод работает с внешним таймером NE555 или супрессором, извините супервизором (очепятка)ivansidor012 писал(а): 18 июл 2021, 17:02 ключевое: рестарт по вачдогу. Она сама выйдет из цикла с ребутом

2) Я спросил об
потому что это разные камни, задачи и методы. Espressif скрывает исходники ESP (SDK), потому о ихней собаке можно только догадываться на основании обобщения наблюдений поведения чипа, в отличии от АВР для которых есть AN_2551. Для поддержания сетевого соединения вероятно необходим периодический пинг. И он находится (очевидно

3) Понижение питания АВР ниже порога сохранения данных в оперативке обрабатывает аппаратный модуль детектора коричневого выхода (Brown-out, дословный перевод). И работает он чуть по другому- делает и удерживает ресет пока напряжение питания не прийдёт в норму.
4) Лог, (отладочная информация) который выдает загрузчик ESP при старте, подозреваю не конкретизирует посредством какого первичного события (модуля Wi-Fi или Brown-out Detector, и т.п.) был ресет, возможно первые вызывают срабатывание собаки или есть её частью, не знаю. Опубликованый лог есть последствием, а не причиной перезагрузки, с её указанием: аппаратный WDT (cause:4). Для ESP в бесконечный цикл нужно наверное нужно вставлять delay(), чтобы отсечь перезагрузку Wi-Fi модулем. См. пункт ниже.
5) Здесь Ваш лог и обсуждение на русском.
6) Во всех уроках по прерываниям пишут, что нельзя пихать в обработчик прерывания функции, а только флаг, который выполнится в основном цикле и сбросится по выполнении, особенно если в обработчике прерываний запрещаются другие событийные прерывания.
Теперь, надеюсь, уже не на столько категорически нет?

Исправил опечатку, добавил документ.
Последний раз редактировалось Labu559 25 июл 2021, 09:41, всего редактировалось 1 раз.
Как "подвесить" МК?
[ref]Labu559[/ref], Все верно, но думаю все же надежнее аппаратное решение (я не проверял) .....в основном цикле МК шлет таймеру команду сброса ....как таймер не получил команду --- он нажимает на ресет МК ....все остальное думаю будет глючить...
Как "подвесить" МК?
Спасибо всем кто откликнулся! Без сомнений, "железная собака" надежнее, но в задаче которую предстоит решить (Attiny1614, ESP я только для примера упомянул), нет возможности ее применить. Как проверить бесконечным циклом внешний ватчдог я понял, пока не совсем ясно, как наблюдать срабатывание на программной реализации сторожа. Начну эксперименты, ну и интересный способ с делением на ноль, тоже хочу опробовать.
Отправлено спустя 47 минут 15 секунд:
Опробовал на Нано, зависает, стандартной защитой Flprog выводит в рабочий режим. Мучают сомнения, действительно ли МК "мертво" висит. Вариант с делением на ноль не сработал, разделил, -1 получается.
Отправлено спустя 47 минут 15 секунд:
Опробовал на Нано, зависает, стандартной защитой Flprog выводит в рабочий режим. Мучают сомнения, действительно ли МК "мертво" висит. Вариант с делением на ноль не сработал, разделил, -1 получается.
Как "подвесить" МК?
Так обычным блинком - для 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
}
нажимаем ресет и то же самое
Как "подвесить" МК?
[ref=#aa0000]Anydy[/ref], ув.Андрей, полностью согласен, потому, что ... тоже не проверялAnydy писал(а): 19 июл 2021, 06:57 Labu559, Все верно, но думаю все же надежнее аппаратное решение (я не проверял)

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

У вас нет необходимых прав для просмотра вложений в этом сообщении.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей