Manejo de excepciones ARM (3): fallas de bus, fallas de administración de memoria, fallas de uso, explicación detallada de fallas graves

Introduje el manejo de excepciones ARM (1) antes: tipo de excepción, agrupación de prioridad y tabla de vectores de excepción . Hay muchos tipos de excepciones en él, y varias excepciones son muy útiles en el manejo de errores:

1 falla de bus

Se genera cuando se recibe una respuesta de error durante la transmisión en la interfaz AHB Bus fault. Puede ocurrir en varias etapas:

  • La etapa de captación previa de instrucciones, a menudo denominadaprefetch abort
  • fase de lectura/escritura de datos, comúnmente conocida comodata abort

En Cortex-M3, también ocurrirán las siguientes situaciones Bus fault:

  • La pila se empuja al comienzo del manejo de interrupciones, llamadostacking error
  • La pila se extrae al final del manejo de la interrupción, llamadounstacking error
  • Cuando el procesador comienza la secuencia de manejo de interrupciones, vector fetchse lee la dirección del vector de interrupción ( ) ( Hard faultun caso especial de
Características:

Si no Bus faultse habilita ningún controlador o si se produce un error de bus en otro Bus faultcontrolador de excepciones que no sea una excepción de mayor prioridad, en su lugar Hard faultse bus faultejecutará la función del controlador de interrupciones. Si Hard faultse genera otro en medio del procesamiento Bus fault, el núcleo entrará en un estado bloqueado.


Causas comunes de las respuestas de error de AHB

  • Se intentó acceder a una región de memoria no válida
  • El dispositivo no está listo para la transmisión (como acceder a un periférico sin inicializarlo)
  • El tamaño de transferencia de palabras no es compatible con el dispositivo de destino (por ejemplo, un registro periférico solo admite acceso a palabras, mientras que el programa accede byte a byte)
  • El dispositivo no acepta transferencias (por ejemplo, algunos periféricos solo se pueden programar en un nivel de acceso privilegiado)

1. ¿Cómo habilitar Bus faultel controlador? Configure el bit
en el NVIC Antes de eso, debe asegurarse de que la dirección de inicio del controlador esté configurada en la tabla de vectores de interrupción.System Handler Control and State registerBUSFAULTENABus fault

2. Bus faultAl ingresar al programa de procesamiento, ¿cómo juzgar qué salió mal?
    NVIC tiene muchos registros de estado de error ( Fault Statuc registers), uno de los cuales es el registro de estado de error del bus ( Bus Fault Status register,BFSR), a partir del cual puede saber si el error se debe al acceso a datos/instrucciones o a la pila de interrupciones y otras razones.
    Si desea ubicar con mayor precisión Bus fault, puede ubicar la instrucción incorrecta a través del contador del programa de pila, y si el bit BFSRes 1, también puede determinar la ubicación de memoria resultante leyendo el registro de dirección de error del bus ( ).BFARVALIDBus Fault Address Register,BFARBus fault

  • En algunos casos, la información en estos registros es inexacta, porque cuando el procesador recibe el error, es posible que se hayan ejecutado muchas otras instrucciones. Por ejemplo, para escribir datos en un búfer, si puede ocurrir un error después de varios ciclos de reloj Bus fault, esto se llama unprecise bus fault ; mientras que para leer la memoria, la siguiente instrucción no se puede ejecutar antes de que se complete la lectura, por lo que en este momento se genera un error inmediatamente. Bus fault, que se llama precise bus fault.

Bus Fault Status RegisterUbicado en la dirección de memoria 0xE000ED29, sus campos son los siguientes:

bits Nombre Tipo Restablecer valor Descripción
7 BFARVALOS - 0 Indica si BFAR es válido
6:5 - - - -
4 STKERR L/E 0 error de apilamiento
3 INSTANTÁNEO L/E 0 error de desapilamiento
2 IMPRECISERR L/E 0 Violación de acceso a datos imprecisos
1 PRECISOR L/E 0 Violación de acceso a datos precisos
0 USUARIO L/E 0 Infracción de acceso a instrucciones
  • Para acceder a este registro, puede acceder a 0xE000ED29 por byte, o puede acceder a 0xE000ED28 por palabra para obtener el segundo byte
  • Escribir un 1 en un bit de indicación de error borrará el estado del bit

2 Fallo de gestión de memoria

Los errores de administración de memoria pueden ser causados ​​por un acceso ilegal a la MPU (Unidad de protección de memoria Memory Protection Unit) o algún acceso ilegal, como ejecutar código en algún área de memoria no ejecutable. Los errores comunes de MPU son los siguientes:

  • Acceso a región de memoria indefinida en MPU
  • Escribir datos en el área de solo lectura
  • Acceda a la memoria a la que solo se puede acceder en modo privilegiado en estado de usuario

La función de manejo de errores de administración de memoria Bus faulttiene las mismas características que las y no se repetirá aquí. Para habilitar el controlador de errores de administración de memoria, se debe System Handler Control and State registerconfigurar un bit en el NVIC MEMFAULTENA.

La NVIC contiene un registro de estado de error de administración de memoria ( Memory Management Fault Status Register,MFSR) para indicar la causa de una falla en la administración de memoria. DACCVIOLSi el bit de acceso ilegal a datos ( ) o la infracción de acceso a instrucciones ( bit) en el registro de estado IACCVIOLes 1, el contador del programa de pila puede ubicar el código incorrecto. Si se establece el bit MFSRin , la ubicación de la dirección de memoria que causó el error MMARVALIDtambién se puede determinar a partir del registro de dirección de administración de memoria ( ) en la NVIC .Memory Management Address Register,MMAR

MFSREl registro se muestra en la siguiente tabla, su dirección es 0xE000ED28 y los campos son los siguientes:

bits Nombre Tipo Restablecer valor Descripción
7 MMARVALS - 0 Indica si MMAR es válido
6:5 - - - -
4 MSTKERRR L/E 0 error de apilamiento
3 MUNSTKERR L/E 0 error de desapilamiento
2 - - - -
1 DACCVIOL L/E 0 Violación de acceso a datos
0 IACVIOL L/E 0 Infracción de acceso a instrucciones
  • El acceso a este registro se puede realizar por byte o por palabra 0xE000ED28
  • Para otros FSRs, escribir un 1 en el bit de estado de error borrará el estado de error.

3 fallos de uso

Usage faultsPuede ser causado por las siguientes situaciones:

  • instrucción indefinida
  • Instrucciones del coprocesador (Cortex-M3 no admite coprocesadores)
  • Intente cambiar a ARM state(puede usar este mecanismo para probar si el procesador lo admite ARM state; Cortex-M3 no lo admite y se producirá un error de uso si cambia)
  • devolución de interrupción no válida ( LRel registro contiene un valor no válido/incorrecto)
  • loadUso de múltiples / storedirectivas para memoria no alineada

Al configurar algunos bits de NVIC, también se pueden generar los siguientes dos tipos Usage fault:

  • división por 0
  • acceder a cualquier memoria no alineada

Usage faultsLos controladores Bus faulttienen las mismas características que , y para habilitarlos Usage faults, debe establecer bits en el System Handler Control and State registerNVIC USGFAULTENA.

El NVIC contiene un registro de estado de error de uso ( Usage Fault Status Register,UFSR) para indicar la causa de un error de uso. Dentro del controlador, el valor del contador del programa de la pila también se puede usar para ubicar el código del programa que causó el error.


Una de las causas Usage fault: una de las razones más comunes para cambiar aARM state
Usage fault es cambiar inadvertidamente el procesador a ARM state, lo que ocurre después de que el usuario carga una dirección con un LSB de 0 PC. Por ejemplo, queremos usar BXla instrucción o BLXpara saltar a un LSB que no tiene una dirección configurada, y el LSB del vector en la tabla de vectores de excepción es 0; o queremos que el POPvalor de PC ya esté en la pila, y el LSB es 0. En estos casos, Usage faultse generará, se establecerá UFSRel registro .INVSTATE

  • El bit LSB más bajo es 1 para indicar el uso deThumb state

UFSREl registro se muestra en la siguiente tabla, su dirección es 0xE000ED2A y los campos son los siguientes:

bits Nombre Tipo Restablecer valor Descripción
9 DIVBYZERO L/E 0 Indica si es un error causado por dividir por 0 (es necesario configurarlo DIV_0_TRP)
8 NO ALINEADO L/E 0 Indica si el error se debe a una desalineación de bytes
7:4 - - - -
3 NOCP L/E 0 Intento de ejecutar una instrucción del coprocesador
2 INVPC L/E 0 EXC_RETURNUna excepción para un valor de retorno incorrecto en un intento de ejecución
1 INVERTIDO L/E 0 Intento de cambiar a un estado no válido (por ejemplo ARM state, )
0 UNDEFINSTR L/E 0 intentar ejecutar una instrucción indefinida
  • Para acceder a este registro, puede acceder a 0xE000ED2A por byte, o puede acceder a 0xE000ED28 por palabra para obtener su byte más alto
  • Para otros FSRs, escribir un 1 en un bit de estado de error borrará el estado de error de ese bit.

4 faltas duras

Si Usage faultsy no tiene un controlador de Bus faultserrores Memory management faultscorrespondiente, se generará uno Hard fault. vector fetchAdemás, también puede deberse a la lectura de la tabla de vectores ( ) durante la ejecución del controlador de excepciones Bus fault. Hay un registro de estado de error de hardware ( HFSR, Hard Fault Status Register) en el NVIC que se puede usar para determinar si el error es vector fetchcausado por . De lo contrario, Hard faultsu controlador de errores debe verificar algo más FSRspara determinar Hard faultla causa.

HFSREl registro es igual a los demás FSRs, y el estado de error se puede borrar escribiendo 1. La dirección de este registro es 0xE000ED2C, y sus campos son los siguientes:

bits Nombre Tipo Restablecer valor Descripción
31 DIVBYZERO L/E 0 Indica si el error fue causado por un evento de depuración
30 FORZADO L/E 0 Indica si el error fue generado por Usage faults, Bus faultsyMemory management faults
29:2 - - - -
1 VECTBL L/E 0 indica que el error es vector fetchcausado por
- - - - -

Supongo que te gusta

Origin blog.csdn.net/tilblackout/article/details/128185998
Recomendado
Clasificación