Выяснение причины Hard Fault в lpc1788

Я разрабатывал прошивку с тяжелой библиотекой графического интерфейса, портированной на lpc1788. . Я использую 32 МБ SDRAM для обработки шрифтов и изображений и флэш-память NAND для хранения двоичных файлов шрифта и bmp, а также данных конфигурации устройства.
Я отключил Usage Fault, MemManage fault и Bus Fault. Поэтому иногда, когда что-то идет не так с какой-либо функцией графического интерфейса, выполнение переходит в Hard Fault. Теперь для графического интерфейса я использовал библиотеку emWin, и у меня нет возможности узнать, какая функция вызвало Hard Fault. Если флэш-память NAND повреждена и библиотека пытается получить что-либо для отображения, скажем, фоновое изображение, то возникает серьезная ошибка. Я могу справиться с такой ситуацией, потому что я точно знаю (с помощью некоторой реализации кода с флагами), что моя NAND-флеш-память повреждена и мне нужно перепрограммировать в нее двоичные файлы, потому что, если я этого не сделаю, всякий раз, когда устройство загружается вверх, это приведет к жесткому сбою.
Но, если какая-то другая подпрограмма вызывает серьезный сбой, то мне фактически не следует заново перепрограммировать всю флэш-память. Таким образом, если я знаю, что вызвало Hard Fault, я смогу соответствующим образом изменить обработчик, решив, нужно ли мне перепрограммировать его или просто изменить некоторые параметры и продолжить с последней известной конфигурацией.

Есть ли способ определить, какая функция вызвала Hard Fault во время выполнения? Даже адреса будет достаточно. Можно ли это сделать?


person Community    schedule 02.05.2014    source источник
comment
Обратите внимание, что ответ является общим для любого устройства Cortex-M3/4 — возможно, вы получите более широкую аудиторию, если не будете излишне конкретизировать конкретный чип. На самом деле вам, вероятно, не нужно было спрашивать; Например, грубая ошибка Google cortex-m. Здесь есть короткий простой вопрос среди множества не относящихся к делу болтовни. Я думаю, что последний абзац это удалить остальные. Хотя emWin является одной из нерелевантных частей, это противоположность тяжелой библиотеки графического интерфейса, Qt - тяжелая библиотека графического интерфейса.   -  person Clifford    schedule 02.05.2014
comment
Можете ли вы заставить его выйти из строя с gdb, подключенным через SWD?   -  person Chris Stratton    schedule 02.05.2014


Ответы (1)


Реализуйте обработчик жестких сбоев, который сообщает о сложенных регистрах. В регистре ПК будет указан адрес выполнения, на котором произошло исключение.

Пример можно найти здесь, хотя использование printf в этом примере, вероятно, нецелесообразно; Я бы посоветовал вам что-то, что писало бы небуферизованное прямо в UART - система уже сломана - чем меньше кода требуется для диагностики, тем лучше. Аналогичное решение здесь просто копирует значения к переменным и требует, чтобы вы установили точку останова в отладчике для их проверки.

Чтобы увидеть код по указанному адресу ПК, либо обратитесь к карте вашего компилятора и/или списку выходных файлов, либо введите адрес непосредственно в регистр ПК в отладчике.

person Clifford    schedule 02.05.2014