Очевидные и неочевидные зависания
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено BLACKEAGLE 01 февраля 2003 г. 00:47
В ответ на: Ответ:+ отправлено Самоучка 31 января 2003 г. 23:26

Очевидные Вы представили себе хоть и примитивно, но логично. Но это как раз наиболее редкие причины - ведь даже если программа улетит в область данных или в непрошитую часть ПЗУ, то там вовсе не обязан встретиться код, означающий 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