Доброго дня всем. После запуска очередного устройства в эксплуатацию, обнаружились зависания контроллера. Как обычно во общем...
Задался я вопросом аппаратного сторожевого таймера (Watchdog/ватчдог-по нашему).
В ATMEL-ах он реализован аппаратно. В нашей FLProg автор его реализовал программно.
То есть...
Есть два способа ресетить контроллер без участия рук.
"Железный" - подача сигнала сброса на вывод Res контроллера, руками либо внешней схемой сброса.
1. Аппаратный - сигнал сброса подает встроенный сторожевой таймер. Этот сброс аналогичный "железному".
2. Программный (софтовый) - это программный переход выполнения программы на 0-вой адрес, т. е. на начальный адрес программы. В принципе, это тоже полезная вещь, но с помощью нее невозможно перегрузить зависший контроллер Ethernet или взглюкнувший LCD.
Пример реализации программного сброса в FLProg
В самом низу мы видим ассемблерную команду jmp 0x0000. Это запись в программный счетчик значения 0, таким образом МЦУ следующей командой выполнит ту, что находится в начале программы. Так осуществляется программный сброс перезапуск контроллера.
Помимо нецелесообразности реализации программного сброса, когда "на борту" есть аппаратные средства, программный сброс еще отнимает ресурсы МК, а именно таймер/счетчик (в нашем примере под номером 2).
В FLProg реализован программный сброс. Почему?
Дело в том, что после перезагрузки, которая была вызвана watchdog, контроллеры последних выпусков оставляют включенным watchdog на минимальный период, т.е. 15ms. Это нужно для того, чтобы программа как-то узнавала, что предыдущая перезагрузка была по watchdog. Поэтому первоочередная задача загрузчика (или вашей программы, если она запускается первой) — сохранить информацию о том, что перезагрузка была «неожиданной» и сразу же выключить watchdog. Если этого не сделать, то система уйдет в bootloop, т.е. будет вечно перегружаться.
Как известно, в Arduino есть специальный загрузчик, который выполняется в первую очередь после перезагрузки системы. И, к огромному сожалению, стандартный загрузчик не сбрасывает watchdog! Таким образом, система заходит в жестокий bootloop (состояние «crazy led», при котором светодиод на 13-м пине мигает как сумасшедший).
_uVideoPlayer({'url':'https://www.youtube.com/watch?v=7DNntda ... 00zk1EgMhd');
Сторожевой таймер. Хард сброс контроллера из FLProg
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
Сторожевой таймер. Хард сброс контроллера из FLProg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
Сторожевой таймер. Хард сброс контроллера из FLProg
Продолжим...
Определим есть ли в бутлоадере вашей платы правильная остановка Watchdoga, последующий его сброс и запуск.
Загружаем скетч
[spoiler=Спойлер]#include
void setup() {
wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop
Serial.begin(9600);
Serial.println("Setup..");
Serial.println("Wait 5 sec..");
delay(5000); // Задержка, чтобы было время перепрошить устройство в случае bootloop
wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек.
Serial.println("Watchdog enabled.");
}
int timer = 0;
void loop(){
// Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial
if(!(millis()%1000)){
timer++;
Serial.println(timer);
digitalWrite(13, digitalRead(13)==1?0:1); delay(1);
}
// wdt_reset();
}[/spoiler]
включаем монитор:
Watchdog не поддерживается загрузчиком:
Watchdog поддерживается загрузчиком:
Anydy: Если у вас в таком случае МК ущел в бесконечный цикл, то тут либо ловить кнопкой ресет для загрузки нового скетча, либо с помощью прогромматора(другой ардуинки) перешивать! Учтите этот момент!
Определим есть ли в бутлоадере вашей платы правильная остановка Watchdoga, последующий его сброс и запуск.
Загружаем скетч
[spoiler=Спойлер]#include
void setup() {
wdt_disable(); // бесполезная строка до которой не доходит выполнение при bootloop
Serial.begin(9600);
Serial.println("Setup..");
Serial.println("Wait 5 sec..");
delay(5000); // Задержка, чтобы было время перепрошить устройство в случае bootloop
wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек.
Serial.println("Watchdog enabled.");
}
int timer = 0;
void loop(){
// Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial
if(!(millis()%1000)){
timer++;
Serial.println(timer);
digitalWrite(13, digitalRead(13)==1?0:1); delay(1);
}
// wdt_reset();
}[/spoiler]
включаем монитор:
Watchdog не поддерживается загрузчиком:
Watchdog поддерживается загрузчиком:
Anydy: Если у вас в таком случае МК ущел в бесконечный цикл, то тут либо ловить кнопкой ресет для загрузки нового скетча, либо с помощью прогромматора(другой ардуинки) перешивать! Учтите этот момент!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
Сторожевой таймер. Хард сброс контроллера из FLProg
Если ваша плата ушла в bootloop, то надо загрузить новый загрузчик. Opiboot кажется называется... Как грузить и где брать советую обратится к mr. Яндексу. Одна из статей по этой теме по ссылке. Скетч для проверки и картинки я от туда потянул. Спасибо Dremkin.
Если плата работает правильно, то берите на тест мои блоки. Один просто в проект добавляете. Команда сброса ватчдога будет в начале основного цикла программы (функции loop).
Второй, со входом WDT_res. Сбрасывает сторожевой таймер по переднему фронту импульса на этом входе. Если этот вход не "дергать", то через 8 с, контроллер перезагрузится.
На случай, когда с ардуинкой на пару работает например Ethernet модуль... Который иногда зависает... Ни программный ни аппаратный сброс может не помочь, т. к. ардуинка будет работать и причин для сброса не будет. То же самое у меня наблюдается с СИМ800. Когда я СМСками "вешаю" ардуинку и ничего не могу поделать пока не приеду и не нажму кнопку ресет. При этом сам модуль в сети. Теперь я по ответам модуля о уровне сети, буду сбрасывать ватчдог. А когда ардуина зависнет, с GSM модулем перестанет общатся, тогда и перестанет ватчдог сбрасывать и перезагрузится аппаратно!
Если плата работает правильно, то берите на тест мои блоки. Один просто в проект добавляете. Команда сброса ватчдога будет в начале основного цикла программы (функции loop).
Второй, со входом WDT_res. Сбрасывает сторожевой таймер по переднему фронту импульса на этом входе. Если этот вход не "дергать", то через 8 с, контроллер перезагрузится.
На случай, когда с ардуинкой на пару работает например Ethernet модуль... Который иногда зависает... Ни программный ни аппаратный сброс может не помочь, т. к. ардуинка будет работать и причин для сброса не будет. То же самое у меня наблюдается с СИМ800. Когда я СМСками "вешаю" ардуинку и ничего не могу поделать пока не приеду и не нажму кнопку ресет. При этом сам модуль в сети. Теперь я по ответам модуля о уровне сети, буду сбрасывать ватчдог. А когда ардуина зависнет, с GSM модулем перестанет общатся, тогда и перестанет ватчдог сбрасывать и перезагрузится аппаратно!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Сторожевой таймер. Хард сброс контроллера из FLProg
Почему то UNO поддерживает включение собачки "из коробки" но не уверен что все
Для других МК нужно перешивать загрузчик - Optiboot
Если нужно, то создам инструкцию как это сделать, хотя их в инете и так полно!
И Даже аппаратный Watchdog в ардуино не спасет от зависаний(может ошибаюсь?)! Только внешний железный!
Для других МК нужно перешивать загрузчик - Optiboot
Если нужно, то создам инструкцию как это сделать, хотя их в инете и так полно!
И Даже аппаратный Watchdog в ардуино не спасет от зависаний(может ошибаюсь?)! Только внешний железный!
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
Сторожевой таймер. Хард сброс контроллера из FLProg
Anydy, думаю разжеванная инструкция не помешает. А то некоторые жалуются
Безусловно внешний сброс самый надежный. За ним аппаратный, а для "школьников" программный) как самый простой и не надежный. Т. к. программа может выполнятся и обнулять счетчик, а устройство в это время не выполнять свои функциональные обязанности. Тут пользователям необходимо выяснять что именно не работает, алгоритм или контроллер.
Anydy, автор статьи пишет что для меги2560 загрузчик отличается от УНОвского... Если есть возможность напишите подробную статью в этой или новой теме по платам, с прикрепленными файлами. Будем тестить.whitevip писал(а):Dev1, тут нет коров, вот имено Вы подметили из нормального форума сделали ненармальный сами же Вы гуру. Сколько я замечаю да и на себе к Вам люди просятся за помощью Вы сразу ему грубите и начинаете придератся и умничать, как он пишит и его граматику обсуждать, но ведь форум не про это.
Смотря как зависнет. Если совсем намертво с остановкой тактового генератора, то "собака" спасет. Тут вопрос в том где в программе расставлены команды сброса собаки. К примеру, в основном цикле loop, стоит сброс WDT, а в какой нить подпрограмме! обработки прерываний ошибка программиста или выгорел порт МК или еще чего, эта подпрограмма неправильно отрабатывает, а в основном цикле дальше продолжает обнуляться WDT. Со стороны устройство покажется зависшим, а по факту будет работать. К примеру зависший Ethernet. Контролер то работает, а в ОПС сервер данные не передает - значит свои функции не выполняет и пользователю все равно завис МК или нет, когда надо полюбому идти жать кнопку ресет. Или наоборот подпрограмма обработки чего либо (напр. ответа от GSM модуля) слишком долго зациклена в ожидании ответа и МК сам перегружается. Т. о. в местах, где контроллер может долго выполнять кусок кода, необходимо вставлять команду сброса WDT.Anydy писал(а):И Даже аппаратный Watchdog в ардуино не спасет от зависаний(может ошибаюсь?)!
Безусловно внешний сброс самый надежный. За ним аппаратный, а для "школьников" программный) как самый простой и не надежный. Т. к. программа может выполнятся и обнулять счетчик, а устройство в это время не выполнять свои функциональные обязанности. Тут пользователям необходимо выяснять что именно не работает, алгоритм или контроллер.
Сторожевой таймер. Хард сброс контроллера из FLProg
.
Последний раз редактировалось Nikan 23 мар 2023, 18:31, всего редактировалось 1 раз.
- ivanpost
- Сержант
- Сообщения: 203
- Зарегистрирован: 24 сен 2016, 22:26
- Откуда: Тольятти
- Имя: Иван
- Благодарил (а): 3 раза
- Поблагодарили: 8 раз
- Контактная информация:
Сторожевой таймер. Хард сброс контроллера из FLProg
Компиляция спотыкается на больших буквах WDT в функции wdt_reset();, а так вроде - работает!
Почему то FlProg ругается на отсутствие библиотеки avrwdt.h , наверно / не понимает. Но все компилируется и работает.
Почему то FlProg ругается на отсутствие библиотеки avrwdt.h , наверно / не понимает. Но все компилируется и работает.
- Сергей
- Лейтенант
- Сообщения: 578
- Зарегистрирован: 31 авг 2015, 15:06
- Имя: Сергей
- Контактная информация:
Сторожевой таймер. Хард сброс контроллера из FLProg
Библу надо в блок вставить. Я не вставлял, она в ИДЕ есть. Но что б не ругался ФЛПрог, ее наду в сам блок скопировать.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость