2010-09-21 14 views
5

Tengo un proyecto integrado que usa un STM32F103 (ARM Cortex M3), está recibiendo ocasionalmente un error grave en el modo de lanzamiento. Como parte de la recuperación, me gustaría recuperar el valor de PC antes de la falla grave y almacenarlo para una depuración posterior en la región con respaldo de batería.ARM Cortex M3 ¿Cómo determino el valor del contador del programa antes de una falla grave?

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

¿Dónde debo buscar? ¿Hay una dirección para el banco de registro de modo normal?

Gracias!

+0

Me gustaría saber también, pero puede obtener una mejor respuesta en chiphacker.com. – leppie

Respuesta

6

Cortex-M3 utiliza un modelo bastante diferente de manejo de excepciones del ARM "clásico", por ejemplo, no tiene el "modo abortar" mencionado en la otra publicación. Le sugiero que lea this app note . por ejemplo, para la Falla duro:

el valor de SCB-> BFAR indica la dirección de memoria que causó un autobús de fallos y es válida si el BFARVALID bit en el registro SCB-> CFSR se ha ajustado el. El valor de SCB-> MMFAR indica la dirección de memoria que provocó una falla de gestión de memoria y es válida si está establecido el bit MMFARVALID en el registro SCB-> CFSR .

Para determinar el valor de la PC en el momento de la excepción, debe examinar la pila; el procesador presiona R0-R3, R12, PC y LR antes de ejecutar el controlador. La pila utilizada puede ser Principal (si el bit 2 de LR es 0) o Proceso (de lo contrario). Vea la página 13 de la nota de la aplicación para más detalles.

+0

Gracias Igor, ¿cómo puedo obtener la PC de la pila? – JeffV

+1

Necesita buscar PSP o MSP y obtener una palabra en offset 0x18 de ella. Vea una implementación de ejemplo aquí: http://embdev.net/topic/170640#1636052 –

+0

Aún tratando de resolver esto. ¿Este desplazamiento está 24 bytes por encima del MSP ?: uint32_t * pc = (uint32_t *) ((char *) _ get_MSP() + 24); – JeffV

3

Debería mirar en el ARM Architecture Reference Manual en la sección de Excepciones. Necesita registrarse para obtenerlo.

Normalmente, una dirección relevante se colocará en el registro de enlace LR (R14), pero el significado exacto varía de acuerdo con la excepción, y existen diferentes desplazamientos.

W.r.t. Al acceder al banco de registros del modo Usuario/Sistema, creo que debe cambiar el modo para acceder a él.

+0

Ahh, genial! Acabo de comprobarlo durante la depuración (no tengo ni idea de cómo invocar un error grave actualmente; p) y de hecho muestra la dirección de la persona que llama. ¡Muchas gracias! – leppie

+0

Bien, veo que no es la persona que llama, sino la dirección del remitente. – leppie

+1

He generado la falla dura por: * ((char *) 0x00) = 5; – JeffV

0

Encontré que una causa común de estos problemas son los retrasos de 'bucle'. Al usar -O3 simplemente se optimizan si no se está refiriendo a variables volátiles. Personalmente, prefiero el enfoque SysTick.

+0

Gracias @leppie, totalmente de acuerdo.No por retrasos de bucle aquí, yo también estoy usando SysTick para mi conteo. Todo está en una máquina de estados también, para evitar el bloqueo. Creo que el problema se presentaría en modo de depuración si le di el tiempo suficiente. – JeffV

1

Cuando se produce una excepción, el estado del procesador cambia del estado actual al abortar el estado. En el estado abortar, el procesador cambia para usar un nuevo conjunto de registros para sp y lr (sp_abt y sp_lr respectivamente. Para un aborto de datos, la instrucción ofensiva puede encontrarse en lr_abt + 8 para un prefecto sobre lr_abt + 4 (según el manual de referencia ARMv7 Architecure)

+0

¡Increíble, gracias! – JeffV

+0

cambiado sp_abt a lr_abt un error bastante grave de mi parte - corregido ahora – doron

+2

Esto es válido para ARM clásico pero no Cortex-M3 –

1

Tengo una pregunta frecuente sobre este tema. La página vinculada a las preguntas frecuentes incluye fault handler code que obtendrá el contador del programa de la pila por usted.

Cuestiones relacionadas