Кто-то любит пирожки, а кто-то - нет.
Бывает, при разных ошибках в коде возникают исключения. Переход по некорректному адресу, чтение или запись куда-то не туда, неправильная инструкция, да мало ли проблем. Как найти среди мешанины кода то место, где всё сломалось? Напрямую Кейл ничего не пишет, Список в Call Stack обычно пуст и не содержит ничего полезного (хотя иногда и обратное верно). Окошечек с информацией тоже нема. Грусть-печаль-тоска.

Но всегда можно вспомнить, что исключение — тоже вполне себе прерывание и действует, как и любое другое прерывание. То есть кладёт в стек копию 8 регистров: R0-R3, R12, LR, PC, CPSR. Нам нужен только PC, где содержится адрес инструкции, следующей за сбойной.


Вот как это можно подглядеть.

А ещё можно в поле Command записать

И получить ответ числом, как оно есть, не ползая по окну памяти.

Капитаню, конечно, но не всегда можно догадаться об этом сразу.

@темы: arm, программизмы, stm32f4discovery, stm32f3discovery, stm32f0discovery, stm32

Комментарии
02.08.2013 в 13:06

Как можно съесть слона? По кусочку за раз
неудобно так...
намного удобнее дописать собственный код в HardFault (и прочие заглушки исключений)
особенно, если в проекте есть логгирование или включён дебажный вывод
09.08.2013 в 10:29

Кто-то любит пирожки, а кто-то - нет.
DAndy_13, конечно можно, но сначала надо понять сам принцип поиска ошибки =) А автоматизировать это уже не проблема...

Кстати, это хорошая идея — сделать заготовки для обработки ошибок с настраиваемым выводом...
09.08.2013 в 10:56

Как можно съесть слона? По кусочку за раз
teplofizik, дарю =)
Помогает сьэкономить кучу времени в "боевых" проектах. Проверено
09.08.2013 в 11:05

Кто-то любит пирожки, а кто-то - нет.
DAndy_13, думаю да =) К счастью, с HF я сталкиваюсь крайне редко...
05.10.2013 в 02:54

Как найти среди мешанины кода то место, где всё сломалось?
Для этого в Cortex-M есть специальные регистры, которые хранят адрес сбоя (для MemManagFault и BusFault)
05.10.2013 в 03:04

Кто-то любит пирожки, а кто-то - нет.
Гость, да, это так, есть даже документы, где описаны возможности именно ядра по более точному определению причин сбоя. Например, Using Cortex-M3 and Cortex-M4 Fault Exceptions.

Но в первом же приближении достаточно посмотреть стек =) Думаю, по строке кода зачастую можно понять, что могло случиться такого, что произошёл сбой =)