|
Очевидные Вы представили себе хоть и примитивно, но логично. Но это как раз наиболее редкие причины - ведь даже если программа улетит в область данных или в непрошитую часть ПЗУ, то там вовсе не обязан встретиться код, означающий rjmp $, и тогда Program Counter спокойно перешагнет из FFFF в 0000 и функциональность самовосстановится.
Неочевидных зависаний множество, и порой приходится тратить значительные вычислительные и/или аппаратные ресурсы МК для того, чтобы их корректно избежать. Примитивный, но наиболее частый вариант - ожидание внешнего события. Мы ведь ну АБСОЛЮТНО уверены, что рано или поздно на ногу порта или в статусный бит какого-либо периферийного устройства попадет ожидаемая "1", вот и долбим цикл типа brbc stat,$ (пример утрирован для наглядности). А этот гадский stat вдруг взял, да и перестал становиться единицей - провод к порту оборвался, слетевший код остановил таймер, UART пропустил бит и т.д., вот и торчим в этом, казалось бы, корректном цикле до морковкиного заговенья - висим-с.
На все подобные поллинги таймаутов и прочих презервативов не напасешься, вот и употребляется WDT - грубое, но неубиенное средство от висяков любого происхождения. Грамотно взводимый WDT дернет Reset, система перезапустится, и, в зависимости от искусности програмиста и наличия в МК средств запоминания причины последнего сброса, сможет восстановить свое функционирование вплоть до воссоздания корректного контекста. Разумеется, периодически "кормить" WDT должна не процедура обработки таймерского прерывания, а какой-либо регулярный процесс фонового уровня, иначе собачка ожиреет и не станет гавкать вовсе :).
А причину зависания Вашей конкретной программы можно выявить и устранить в том случае, если ситуация воссоздаваема и повторяема. Способов масса, но начинать, как Вы правильно подозреваете, следует именно с питания, а еще вернее - с земли. Для того, чтобы узнать, "куда" улетела программа, наставьте в явно незадействованых кусках Flash коды типа cbi porta,0 и sbi porta,0 и отслеживайте их осциллографом, стремясь выяснить, какой кусок кода вероятнее всего вылетает. Вполне вероятна, разумеется, и просто программная описка типа лишний/недостающий ret с неизбежным переполнением стека и т.д.
E-mail: info@telesys.ru