ARM Cortex M3 Как определить значение счетчика программы перед серьезной неисправностью? - PullRequest
5 голосов
/ 22 сентября 2010

У меня есть встроенный проект, использующий STM32F103 (ARM Cortex M3), в режиме выпуска он иногда получает серьезную ошибку. В качестве части восстановления я хотел бы получить значение ПК до серьезной ошибки и сохранить его для последующей отладки в области с батарейным питанием.

Как определить значение счетчика программы в точке серьезной ошибки? Очевидно, что теперь ПК настроен на свое место в пределах прерывания после сбоя.

Куда мне смотреть? Есть ли там адрес для банка регистрации обычного режима?

Спасибо!

Ответы [ 5 ]

6 голосов
/ 22 сентября 2010

Cortex-M3 использует совершенно другую модель обработки исключений из "классического" ARM, например в этом посте не упоминается «режим прерывания». Я предлагаю вам прочитать примечание к этому приложению . Например, для Hard Fault:

Значение SCB-> BFAR указывает адрес памяти, вызвавший сбой шины и действителен, если установлен бит BFARVALID в регистре SCB-> CFSR. значение SCB-> MMFAR указывает адрес памяти, который вызвал память Ошибка управления и действительна, если бит MMFARVALID в SCB-> CFSR регистр установлен.

Чтобы определить значение ПК в момент исключения, вам нужно проверить стек; процессор запускает R0-R3, R12, ПК и LR перед выполнением обработчика. Используемый стек может быть либо основным (если бит 2 LR равен 0), либо процессом (в противном случае) Подробнее см. На странице 13 приложения.

3 голосов
/ 22 сентября 2010

Вам следует обратиться к Справочному руководству по архитектуре ARM в разделе «Исключения». Вам нужно зарегистрироваться, чтобы получить его.

Как правило, соответствующий адрес будет помещен в регистр связи LR (R14), но точное значение меняется в зависимости от исключения, и существуют различные смещения.

W.r.t. доступ к банку реестра режима пользователя / системы, я думаю, вам нужно переключить режим для доступа к нему.

1 голос
/ 12 июня 2013

У меня есть FAQ по этой самой теме. Страница, на которую ссылается FAQ, содержит код обработчика ошибок , который получит для вас счетчик программ из стека.

1 голос
/ 22 сентября 2010

При возникновении исключения состояние процессора изменяется с текущего состояния на состояние abort . В состоянии прерывания процессор переходит на использование нового набора регистров для sp и lr (sp_abt и sp_lr соответственно. Для прерывания данных нарушающая инструкция может быть найдена в lr_abt + 8 для префекта в lr_abt + 4 (согласно Справочное руководство по архитектуре ARMv7)

0 голосов
/ 22 сентября 2010

Я обнаружил, что частой причиной этих проблем являются задержки 'for loop'.При использовании -O3 они просто оптимизируются, если вы не имеете в виду изменчивые переменные.Лично я предпочитаю подход SysTick.

...