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