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

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

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

#1

Сообщение Сергей » 20.11.2017{, 16:38}

Доброго дня всем. После запуска очередного устройства в эксплуатацию, обнаружились зависания контроллера. Как обычно во общем...
Задался я вопросом аппаратного сторожевого таймера (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':'');
Вложения
8440440.jpg

Аватара пользователя
Сергей
Лейтенант
Сообщения: 578
Зарегистрирован: 31.08.2015{, 15:06}
Репутация: 6
Имя: Сергей
Контактная информация:

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

#2

Сообщение Сергей » 20.11.2017{, 16:49}

Продолжим...
Определим есть ли в бутлоадере вашей платы правильная остановка Watchdoga, последующий его сброс и запуск.
Загружаем скетч

СпойлерПоказать
#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();
}
включаем монитор:
Watchdog не поддерживается загрузчиком:


Watchdog поддерживается загрузчиком:


Anydy: Если у вас в таком случае МК ущел в бесконечный цикл, то тут либо ловить кнопкой ресет для загрузки нового скетча, либо с помощью прогромматора(другой ардуинки) перешивать! Учтите этот момент!
Вложения
1047385.jpg
7819738.jpg

Аватара пользователя
Сергей
Лейтенант
Сообщения: 578
Зарегистрирован: 31.08.2015{, 15:06}
Репутация: 6
Имя: Сергей
Контактная информация:

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

#3

Сообщение Сергей » 20.11.2017{, 17:12}

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

На случай, когда с ардуинкой на пару работает например Ethernet модуль... Который иногда зависает... Ни программный ни аппаратный сброс может не помочь, т. к. ардуинка будет работать и причин для сброса не будет. То же самое у меня наблюдается с СИМ800. Когда я СМСками "вешаю" ардуинку и ничего не могу поделать пока не приеду и не нажму кнопку ресет. При этом сам модуль в сети. Теперь я по ответам модуля о уровне сети, буду сбрасывать ватчдог. А когда ардуина зависнет, с GSM модулем перестанет общатся, тогда и перестанет ватчдог сбрасывать и перезагрузится аппаратно!
Вложения
0975451.jpg
_WDT__-CODE-.ubi
(14.89 КБ) 135 скачиваний
_WDT-CODE-.ubi
(8.73 КБ) 133 скачивания

Anydy

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

#4

Сообщение Anydy » 20.11.2017{, 17:16}

Почему то UNO  поддерживает включение собачки "из коробки" но не уверен что все
Для других МК нужно перешивать загрузчик - Optiboot
Если нужно, то создам инструкцию как это сделать, хотя их в инете и так полно!
И Даже аппаратный Watchdog в ардуино не спасет от зависаний(может ошибаюсь?)! Только внешний железный!

Аватара пользователя
Сергей
Лейтенант
Сообщения: 578
Зарегистрирован: 31.08.2015{, 15:06}
Репутация: 6
Имя: Сергей
Контактная информация:

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

#5

Сообщение Сергей » 20.11.2017{, 18:23}

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

Аватара пользователя
Nikan
Майор
Сообщения: 1194
Зарегистрирован: 29.12.2016{, 00:49}
Репутация: 100
Откуда: москва

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

#6

Сообщение Nikan » 20.11.2017{, 18:33}

.
Последний раз редактировалось Nikan 23.03.2023{, 18:31}, всего редактировалось 1 раз.

Аватара пользователя
ivanpost
Сержант
Сообщения: 140
Зарегистрирован: 24.09.2016{, 22:26}
Репутация: 4
Откуда: Тольятти
Имя: Иван
Контактная информация:

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

#7

Сообщение ivanpost » 20.01.2018{, 21:30}

Компиляция спотыкается на больших буквах WDT в функции wdt_reset();, а так вроде - работает!
Почему то FlProg ругается на отсутствие библиотеки avrwdt.h , наверно / не понимает. Но все компилируется и работает.

Аватара пользователя
Сергей
Лейтенант
Сообщения: 578
Зарегистрирован: 31.08.2015{, 15:06}
Репутация: 6
Имя: Сергей
Контактная информация:

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

#8

Сообщение Сергей » 20.01.2018{, 22:16}

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

Ответить

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