ARM CORTEX M3 Как определить значение счетчика программы до жесткой неисправности?
-
04-10-2019 - |
Вопрос
У меня есть встроенный проект с использованием STM32F103 (ARM CORTEX M3), оно получает время от времени получать неисправность в режиме выпуска. В рамках восстановления я хотел бы получить значение ПК от передней неисправности и хранить его на более позднюю отладку в области батареи.
Как бы я определил значение счетчика программы в точке тяжелой вины? Очевидно, что PC теперь установлен на его местоположение в пределах прерывания HardFault.
Где я должен выглядеть? Там есть адрес для нормального режима регистра?
Спасибо!
Решение
Cortex-M3 использует совершенно другую модель обработки исключений из «классической» руке, например, у него нет «режима прерывания», упомянутой в другом посте. Я предлагаю вам прочитать Это приложение примечание. Отказ Например, для жесткой неисправности:
Значение SCB-> BFAR указывает на адрес памяти, вызвавший неисправность шины и действителен, если установлен бит BFARVALDY в регистре SCB-> CFSR. Значение SCB-> MMFAR указывает на адрес памяти, который вызвал ошибку управления памятью и действителен, если установлен бит MMFarValid в регистре SCB-> CFSR.
Чтобы определить значение ПК во время исключения, необходимо изучить стек; Процессор подталкивает R0-R3, R12, PC и LR перед выполнением обработчика. Используемый стек может быть главным (если бит 2 LR равно 0) или процессом (в противном случае). См. Стр. 13 Приложение для получения подробной информации.
Другие советы
Вы должны смотреть в Руководство по руководству архитектуры ARM В разделе на исключениях. Вам нужно зарегистрироваться, чтобы получить его.
Как правило, соответствующий адрес будет помещен в регистр связи LR (R14), но точное значение варьируется в зависимости от исключения, и есть различные смещения.
WRT Доступ к банку регистра пользователя / системной системы, я думаю, вам нужно переключить режим для доступа к нему.
Когда происходит исключение, процессорное состояние изменяется от текущего состояния в прервать состояние. В прерском состоянии процессор смещается для использования нового набора регистров для SP и LR (SP_ABT и SP_LR соответственно. Для прерывания данных инструкция на оскорблении можно найти в LR_ABT + 8 для префекта в LR_ABT + 4 (согласно Руководство по руководству Armv7 Architecure)
У меня часто задаваемые вопросы по этому вопросу. Страница, связанная с FAQ, включает в себя Код обработки неисправности Это получит счетчик программы от стека для вас.
Я обнаружил, что общая повод для этих вопросов - это те для задержек цикла. При использовании -O3 они просто оптимизированы, если вы не имеете в виду летучие переменные. Лично я предпочитаю подход Systick.