ARM CORTEX M3 Как определить значение счетчика программы до жесткой неисправности?

StackOverflow https://stackoverflow.com/questions/3764119

Вопрос

У меня есть встроенный проект с использованием 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top