Сторожевой таймер. Хард сброс контроллера из FLProg

Ответить
Аватара пользователя
Сергей
Лейтенант
Сообщения: 578
Зарегистрирован: 31 авг 2015, 15:06
Имя: Сергей
Контактная информация:

Сторожевой таймер. Хард сброс контроллера из FLProg

Сообщение Сергей »

Доброго дня всем. После запуска очередного устройства в эксплуатацию, обнаружились зависания контроллера. Как обычно во общем...
Задался я вопросом аппаратного сторожевого таймера (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');
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Сергей
Лейтенант
Сообщения: 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: Если у вас в таком случае МК ущел в бесконечный цикл, то тут либо ловить кнопкой ресет для загрузки нового скетча, либо с помощью прогромматора(другой ардуинки) перешивать! Учтите этот момент!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Сергей
Лейтенант
Сообщения: 578
Зарегистрирован: 31 авг 2015, 15:06
Имя: Сергей
Контактная информация:

Сторожевой таймер. Хард сброс контроллера из FLProg

Сообщение Сергей »

Если ваша плата ушла в bootloop, то надо загрузить новый загрузчик. Opiboot кажется называется... Как грузить и где брать советую обратится к mr. Яндексу. Одна из статей по этой теме по ссылке. Скетч для проверки и картинки я от туда потянул. Спасибо Dremkin.
Если плата работает правильно, то берите на тест мои блоки. Один просто в проект добавляете. Команда сброса ватчдога будет в начале основного цикла программы (функции loop).
Второй, со входом WDT_res. Сбрасывает сторожевой таймер по переднему фронту импульса на этом входе. Если этот вход не "дергать", то через 8 с, контроллер перезагрузится.

На случай, когда с ардуинкой на пару работает например Ethernet модуль... Который иногда зависает... Ни программный ни аппаратный сброс может не помочь, т. к. ардуинка будет работать и причин для сброса не будет. То же самое у меня наблюдается с СИМ800. Когда я СМСками "вешаю" ардуинку и ничего не могу поделать пока не приеду и не нажму кнопку ресет. При этом сам модуль в сети. Теперь я по ответам модуля о уровне сети, буду сбрасывать ватчдог. А когда ардуина зависнет, с GSM модулем перестанет общатся, тогда и перестанет ватчдог сбрасывать и перезагрузится аппаратно!
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Anydy

Сторожевой таймер. Хард сброс контроллера из FLProg

Сообщение Anydy »

Почему то UNO  поддерживает включение собачки "из коробки" но не уверен что все
Для других МК нужно перешивать загрузчик - Optiboot
Если нужно, то создам инструкцию как это сделать, хотя их в инете и так полно!
И Даже аппаратный Watchdog в ардуино не спасет от зависаний(может ошибаюсь?)! Только внешний железный!
Аватара пользователя
Сергей
Лейтенант
Сообщения: 578
Зарегистрирован: 31 авг 2015, 15:06
Имя: Сергей
Контактная информация:

Сторожевой таймер. Хард сброс контроллера из FLProg

Сообщение Сергей »

Anydy, думаю разжеванная инструкция не помешает. А то некоторые жалуются 
whitevip писал(а):Dev1, тут нет коров, вот имено Вы подметили из нормального форума сделали ненармальный сами же Вы гуру. Сколько я замечаю да и на себе к Вам люди просятся за помощью Вы сразу ему грубите и начинаете придератся и умничать, как он пишит и его граматику обсуждать, но ведь форум не про это.
Anydy, автор статьи пишет что для меги2560 загрузчик отличается от УНОвского... Если есть возможность напишите подробную статью в этой или новой теме по платам, с прикрепленными файлами. Будем тестить.
Anydy писал(а):И Даже аппаратный Watchdog в ардуино не спасет от зависаний(может ошибаюсь?)!
Смотря как зависнет. Если совсем намертво с остановкой тактового генератора, то "собака" спасет. Тут вопрос в том где в программе расставлены команды сброса собаки. К примеру, в основном цикле loop, стоит сброс WDT, а в какой нить подпрограмме! обработки прерываний ошибка программиста или выгорел порт МК или еще чего, эта подпрограмма неправильно отрабатывает, а в основном цикле дальше продолжает обнуляться WDT. Со стороны устройство покажется зависшим, а по факту будет работать. К примеру зависший Ethernet. Контролер то работает, а в ОПС сервер данные не передает - значит свои функции не выполняет и пользователю все равно завис МК или нет, когда надо полюбому идти жать кнопку ресет. Или наоборот подпрограмма обработки чего либо (напр. ответа от GSM модуля) слишком долго зациклена в ожидании ответа и МК сам перегружается. Т. о. в местах, где контроллер может долго выполнять кусок кода, необходимо вставлять команду сброса WDT.
Безусловно внешний сброс самый надежный. За ним аппаратный, а для "школьников" программный) как самый простой и не надежный. Т. к. программа может выполнятся и обнулять счетчик, а устройство в это время не выполнять свои функциональные обязанности. Тут пользователям необходимо выяснять что именно не работает, алгоритм или контроллер.
Аватара пользователя
Nikan
Майор
Сообщения: 1194
Зарегистрирован: 29 дек 2016, 00:49
Откуда: москва

Сторожевой таймер. Хард сброс контроллера из FLProg

Сообщение Nikan »

.
Последний раз редактировалось Nikan 23 мар 2023, 18:31, всего редактировалось 1 раз.
Аватара пользователя
ivanpost
Сержант
Сообщения: 203
Зарегистрирован: 24 сен 2016, 22:26
Откуда: Тольятти
Имя: Иван
Благодарил (а): 3 раза
Поблагодарили: 8 раз
Контактная информация:

Сторожевой таймер. Хард сброс контроллера из FLProg

Сообщение ivanpost »

Компиляция спотыкается на больших буквах WDT в функции wdt_reset();, а так вроде - работает!
Почему то FlProg ругается на отсутствие библиотеки avrwdt.h , наверно / не понимает. Но все компилируется и работает.
Аватара пользователя
Сергей
Лейтенант
Сообщения: 578
Зарегистрирован: 31 авг 2015, 15:06
Имя: Сергей
Контактная информация:

Сторожевой таймер. Хард сброс контроллера из FLProg

Сообщение Сергей »

ivanpost писал(а): 20 янв 2018, 21:30 FlProg ругается на отсутствие библиотеки avrwdt.h
Библу надо в блок вставить. Я не вставлял, она в ИДЕ есть. Но что б не ругался ФЛПрог, ее наду в сам блок скопировать.
Ответить

Вернуться в «Arduino. Другие МК»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость