У меня в микроконтроллере было место, где я ждал ответа от микросхемы. Это была одна из основных микросхем, расположенная на той же плате, поэтому я решил, что если уж она не отвечает, то у нас есть проблемы посерьёзнее, чем зависание прошивки. Я написал:
while(!DataReady())
;
Зря я это сделал.
Всё работало хорошо, пока не пришёл разработчик ПЛИСины, которая также установлена на плате с микроконтроллером (но ПЛИСина выполнена в виде отдельной платы, вставляемой в раз'ём).
Проблема была следующего характера.
1. В макет вставляется непрошитая ПЛИСина.
2. Запускается прошивка МК.
3. Ответа от дочерней микросхемы нет.
4. Глобальный WatchDog через 30 секунд принудительно перезагружает МК.
Почему ответа от дочерней микросхемы нет? Потому что линии управления к ней проброшены через ПЛИС. А она ещё не прошита.
ПЛИС прошивается дольше 30 секунд. Поэтому при текущей прошивке МК её прошить невозможно. Замкнутый круг.
Решение понятно: мне придётся прошерстить всю прошивку на предмет таких циклов (полагаю, что их ещё несколько) и установить на каждый из них собственный таймер и выставление кода ошибки в случае таймаута.
Я нарушил прошивочную философию, которая заключается в том, что прошивка должна по минимуму впадать в необрабатываемые и неотвечающие состояния -- и всегда мочь сообщить, что с ней случилось.