Кто-то любит пирожки, а кто-то - нет.
Бывает, при разных ошибках в коде возникают исключения. Переход по некорректному адресу, чтение или запись куда-то не туда, неправильная инструкция, да мало ли проблем. Как найти среди мешанины кода то место, где всё сломалось? Напрямую Кейл ничего не пишет, Список в Call Stack обычно пуст и не содержит ничего полезного (хотя иногда и обратное верно). Окошечек с информацией тоже нема. Грусть-печаль-тоска.
Но всегда можно вспомнить, что исключение — тоже вполне себе прерывание и действует, как и любое другое прерывание. То есть кладёт в стек копию 8 регистров: R0-R3, R12, LR, PC, CPSR. Нам нужен только PC, где содержится адрес инструкции, следующей за сбойной.
Вот как это можно подглядеть.
А ещё можно в поле Command записать
И получить ответ числом, как оно есть, не ползая по окну памяти.
Капитаню, конечно, но не всегда можно догадаться об этом сразу.
Но всегда можно вспомнить, что исключение — тоже вполне себе прерывание и действует, как и любое другое прерывание. То есть кладёт в стек копию 8 регистров: R0-R3, R12, LR, PC, CPSR. Нам нужен только PC, где содержится адрес инструкции, следующей за сбойной.
Вот как это можно подглядеть.
А ещё можно в поле Command записать
И получить ответ числом, как оно есть, не ползая по окну памяти.
Капитаню, конечно, но не всегда можно догадаться об этом сразу.
намного удобнее дописать собственный код в HardFault (и прочие заглушки исключений)
особенно, если в проекте есть логгирование или включён дебажный вывод
Кстати, это хорошая идея — сделать заготовки для обработки ошибок с настраиваемым выводом...
Помогает сьэкономить кучу времени в "боевых" проектах. Проверено
Для этого в Cortex-M есть специальные регистры, которые хранят адрес сбоя (для MemManagFault и BusFault)
Но в первом же приближении достаточно посмотреть стек =) Думаю, по строке кода зачастую можно понять, что могло случиться такого, что произошёл сбой =)