?

Log in

No account? Create an account

Previous Entry | Next Entry

Уже несколько месяцев меня мучал один неприятный и весьма нестабильный баг - по непонятным причинам контроллер входил в какой-то режим, в котором он постоянно перезагружался при выключении связного модуля. При чём перезагружался он чётко и стабильно - инициализация переферии, включение связного модуля, нормальный сеанс связи, выключение, ребут и так по кругу, до тех пор, пока либо не снимешь с него всё напряжение, отключив питание и разрядив все кондёры, либо не перепрошьёшь его (external reset и кратковременное передёргивание батарейки не помогало). Отладка осложнялась нерегулярностью проявления бага - от пары раз в неделю, до раза в пару-тройку недель.
Сегодня подловил этот баг в процессе отладки бутлоадера, в результате чего выяснилось, что во-первых контроллер ребутится только в основной прошивке, хотя бутлоадер использует аналогичный код для обмена информации, только более плоский, а во-вторых - что перепрошивка через бутлоадер не выводит контроллер из этого состояния. Дальше дело техники - урезаем программу по максимуму, пичкаем код отладочным выводом и тд. Короче, причина бага оказалась банальной - я забыл сделать явную инициализацию одного из своих регистров флагов, в результате чего при каких-то хитрых стечениях обстоятельств появлялась единичка в разряде "иди в бутлоадер" - вот он и шёл...
К чему я это? Ну, например, "не доверяйте компилятору, делайте инициализацию явным образом", или просто "будьте внимательны, ищите ошибки у себя, а не у других".
Единственное, что смущает - раньше я ловил подобные ребуты и в бутлоадере и в урезанной по самое немогу прошивке, но было это на одной из первых версий прибора, которая вся искалечена экспериментами. Остаётся только надеяться, что там глюки были всё-таки обусловлены кривым питанием или парой косяков, исправленных в новой модификации.