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