Как узнать, что сработал сторожевой таймер?
- Войдите на сайт для отправки комментариев
Сб, 28/11/2015 - 21:28
Здравствуйте.
Arduino Mega 2560
В скетче:
…
wdt_enable(WDTO_8S);
…
wdt_reset();
…
Как в программе можно определить, что перезагрузка была произведена сторожевым таймером, а не простым отключением питания?
Хороший вопрос, подпишусь.
ага. и, как в программе определить, что питание было отключено?
ага. и, как в программе определить, что питание было отключено?
не?
В atmega328p, например, есть регистр MCUSR, который после загрузки показывает причину перезагрузки.
В ДШ это звучит так:
Этот регистр используется в некоторых бутлоадерах и после чтения сбрасывается, нужно про это помнить.
Только почитайте ДШ, прежде чем использовать этот метод, там есть тонкости.
ISR(WDT_vect) {}
не?
дык и я ничего не понимаю, чего не понимаю, вбиваю в хугл и понимаю.
но не суть - сторожевой таймер срабатывает, когда всё зависло, программно что-то отработать невозможно.
нужно рыть в сторону отличий инициализации камня при включении камня и перезагрузке камня и выдавать эту инфу после перезагрузки.
Спасибо всем за помощь. Так хотелось абстрагироваться от железа. Видимо не прокатит. Может действительно есть что-то типа регистра MCUSR но ели бутлоадер трет… Будем пошматреть.
а, если бы я такое делал, то сделал бы на тиньке 13-й аппаратный сигнализатор перезагрузки контроллера-поциента с двумя цифровыми входами следящими за наличием питания и за ногой, которой бы дёргал контроллер в сетапе при запуске - если питание не пропадало, а контроллер дёргает ногой с частотой WDTO, то что-то делать.
Так хотелось абстрагироваться от железа. Видимо не прокатит.
Умение работать с железом на низком уровне очень пригодится, и не раз.
Может действительно есть что-то типа регистра MCUSR
Есть. Такой же MCUSR, как и в ATmega328P. В даташите стр. 64.
В регистре MCUSR бит WDRF: Watchdog Reset Flag. This bit is set if a Watchdog Reset occurs. The bit is reset by a Power-on Reset, or by writing a logic zero to the flag.
Так хотелось абстрагироваться от железа.
Если абстрагироваться от железа, задача выглядит так:
При старте контроллер должен получить некоторую информацию. Без этого - НИКАК. Следовательно, есть только два варианта:
1. В том железе, что мы используем есть специальная фича для сохранения нужной нам информации - ее и используем.
2. В используемом нами железе нужной фичи нет, либо мы по каким-то причинам не хотим ею пользоваться. Тогда нам нужно добавить в систему некоторое дополнительное железо, которое будет обеспечивать сохрарение нужной нам информации и выдачу ее по запросу основного железа.
Т.е. без железа, которое хранит нужную нам информацию, - никак. Вопрос только в том, что это за жалезо.
В регистре MCUSR бит WDRF: Watchdog Reset Flag. This bit is set if a Watchdog Reset occurs. The bit is reset by a Power-on Reset, or by writing a logic zero to the flag.
В Ардуино есть точка входа ранее setup(). Если описать глобальный объект, то его конструктор будет выполняться ранее setup() и ранее по крайней мере некоторых действий по инициализации.
В Ардуино есть точка входа ранее setup(). Если описать глобальный объект, то его конструктор будет выполняться ранее setup() и ранее по крайней мере некоторых действий по инициализации.
В Ардуино есть точка входа ранее setup(). Если описать глобальный объект, то его конструктор будет выполняться ранее setup() и ранее по крайней мере некоторых действий по инициализации.
А поясните плз в чем смысл этой процедуры? В setup включили сторожевой таймер - он раз в секунду ресетит процессор. Не могу понять смысла.
Большинство бутлоадеров, насколько я знаю, очищают эти флаги. Наверно и ваш бул делает то же самое. Я правда не понимаю, зачем это надо (бутлоадеру чистить флаги )
В общем, видимо надо копать исходный код бутлоадера, например оптибута.
А поясните плз в чем смысл этой процедуры? В setup включили сторожевой таймер - он раз в секунду ресетит процессор. Не могу понять смысла.
Отойди мальчик, не мешай.
А если серьезно - вместо того чтоб задавать глупые вопросы, может сначала почитаете про вотчдог?
b707, тоже как то раз интересовался этим. С чтением состояния были проблемы, может в свежих версиях всё исправили?
В общем, видимо надо копать исходный код бутлоадера, например оптибута.
Вот тут обсуждается, как править бут и как потом читать флаг WDRF - надо пробовать
http://forum.arduino.cc/index.php?topic=27162.0
Сделай собаку двухступенчатой, в прерывании пиши состояние в епром, делай jmp 0