Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2751
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Продвинутые методы отладки

674

Рисунок 3: Как текущие регистры R0-R1 указывают на загруженные в стек регистры и на

реальный регистр LR

24.1.1.1.Как инструментарий GNU MCU Eclipse обрабатывает исключения отказов

Инструментарий GNU MCU Eclipse уже предоставляет реализацию для обработчиков отказов Cortex-M. Обработчики инструментария собирают информацию о загруженных в стек регистрах ядра и выводят их содержимое, используя полухостинг ARM или интерфейс ITM – продвинутую функцию отладки, которую мы проанализируем позже в данной главе. Обработчики по умолчанию определены в файле system/src/cortexm/exception_handlers.c, и они определены с помощью атрибута GCC weak, так что вы можете переопределить их в своем коде. Вы можете включить полухостинг ARM, определив макрос OS_USE_TRACE_SEMIHOSTING_DEBUG на уровне проекта, чтобы обработчики по умолчанию автоматически выводили содержимое регистров ядра в консоль OpenOCD. Обработчики инструментария также включают в себя программную точку останова с использованием ассемблерной инструкции BKPT #0, продемонстрированной в Главе 5. Она автоматически остановит выполнение кода, чтобы мы могли быть предупреждены о состоянии отказа во время отладки.

Прочитайте внимательно

Обратите внимание, что последние версии CubeMX могут автоматически генерировать прототипы функций для обработчиков отказов. Они генерируются внутри файла src/stm32XXxx_it.c. После генерации они явно переопределяют обработчики инструментария, и поэтому вы не сможете увидеть на консоли OpenOCD содержимое регистров после возникновения исключения отказа. Если вам не нужны пользовательские обработчики отказов, проверьте конфигурацию CubeMX, чтобы она не генерировала их.

Продвинутые методы отладки

675

Рисунок 4: Как Eclipse показывает стек вызовов после возникновения исключения отказа

Инструментарий GNU MCU Eclipse также может графически отображать стек вызовов, чтобы вы могли понять строку кода, которая вызвала исключение отказа. Среда Eclipse IDE способна автоматически декодировать содержимое загруженных в стек регистров ядра и показывать вам исходный код, который должен вызвать отказ. На рисунке 4 справа показано содержимое загруженных в стек регистров ядра, выведенных в терминал с помощью процедуры обработчика по умолчанию7. Как видите, значение загруженного в стек PC совпадает с показанным в стеке вызовов в Eclipse IDE (прямоугольное поле, выделенное красным). Кроме того, стек вызовов также показывает содержимое текущего регистра LR, который также называется значением EXC_RETURN.

24.1.1.2.Как интерпретировать содержимое регистра LR при переходе в исключение

В процессорах на базе Cortex-M механизм возврата из исключений срабатывает при помощи специального адреса возврата, называемого EXC_RETURN. Это значение генерируется при переходе в исключение и сохраняется в регистре связи (Link Register, LR). Когда это значение записывается в PC с помощью одной из разрешенных инструкций возврата из функции, оно запускает последовательность возврата из исключения.

Адрес EXC_RETURN не соответствует фактическим адресам FLASH. Он может принимать до шести значений, перечисленных в таблице 1.

7 Для полноты картины мы должны сказать, что на рисунке 4 показан неточный отказ шины BusFault (imprecise BusFault), то есть PC не указывает на строку, которая вызвала отказ, а вместо этого указывает на следующую. Причина, по которой это происходит, позже будет объяснена лучше.