Pregunta

Tengo un proyecto incorporado mediante una STM32F103 (ARM Cortex M3), se está haciendo un fallo duro de vez en cuando entrar en modo de lanzamiento. Como parte de la recuperación, me gustaría recuperar el valor PC de antes del fallo duro y almacenarla para su posterior depuración en la región respaldo de batería.

¿Cómo puedo determinar el valor del contador de programa en el punto de la falla duro? Obviamente, el PC se establece ahora en su ubicación dentro de la interrupción hardfault.

¿Dónde debo buscar? Es allí una dirección para el banco de registro de modo normal,?

Gracias!

¿Fue útil?

Solución

Cortex-M3 utiliza un modelo bastante diferente de manejo de excepciones de la "clásico" ARM, por ejemplo, que no tiene "aborto de modo" que se menciona en el otro post. Yo sugiero que lea esta aplicación nota . Por ejemplo, para la Falla duro:

El valor de SCB-> BFAR indica la dirección de memoria que provocó un error de autobús y es válida si el BFARVALID bit en el registro SCB-> CFSR se establece. los valor de SCB-> MMFAR indica la dirección de memoria que causó una memoria Falla y la gestión es válida si el MMFARVALID poco en el SCB-> CFSR registro es establecido.

Para determinar el valor de PC en el momento de excepción es necesario examinar la pila; empuja el procesador R0-R3, R12, PC y LR antes de ejecutar el manejador. La pila utilizada puede ser o bien principal (si el bit 2 de LR es 0) o proceso (lo contrario). Consulte la página 13 de la nota de aplicación para más detalles.

Otros consejos

Usted debe mirar en la arquitectura ARM Manual de referencia en el apartado de excepciones. Usted necesita registro para conseguirlo.

Normalmente, una dirección relevante será puesto en la LR registro de enlace (R14), pero el significado preciso varía de acuerdo con la excepción, y hay distintas compensaciones.

W.r.t. el acceso al banco de registros de modo de usuario / sistema, creo que es necesario para cambiar el modo de acceder a él.

Cuando se produce una excepción, el cambio de estado del procesador del estado actual al abortar estado. En el estado de aborto los cambios de procesador para utilizar un nuevo conjunto de registros para sp y LR (sp_abt y sp_lr respectivamente. Para un conjunto de datos abortan, la instrucción infractor se puede encontrar en lr_abt + 8 para un prefecto sobre en lr_abt + 4 (según el manual de referencia ARMv7 Architecure)

Tengo un FAQ sobre este mismo tema. La página de enlaces desde el FAQ incluye fallo código de controlador que va a obtener el contador de programa de la pila para usted.

He encontrado una causa común para estos temas son aquellos '' para bucle de retrasos. Al utilizar -O3 que simplemente se optimizan inmediatamente si esta no se está refiriendo a las variables volátiles. Personalmente, prefiero el enfoque SysTick.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top