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:
Directorio de artículos
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 denominada
prefetch abort
- fase de lectura/escritura de datos, comúnmente conocida como
data abort
En Cortex-M3, también ocurrirán las siguientes situaciones Bus fault
:
- La pila se empuja al comienzo del manejo de interrupciones, llamado
stacking error
- La pila se extrae al final del manejo de la interrupción, llamado
unstacking error
- Cuando el procesador comienza la secuencia de manejo de interrupciones,
vector fetch
se lee la dirección del vector de interrupción ( ) (Hard fault
un caso especial de
Si no Bus fault
se habilita ningún controlador o si se produce un error de bus en otro Bus fault
controlador de excepciones que no sea una excepción de mayor prioridad, en su lugar Hard fault
se bus fault
ejecutará la función del controlador de interrupciones. Si Hard fault
se 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 fault
el 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 register
BUSFAULTENA
Bus fault
2. Bus fault
Al 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 BFSR
es 1, también puede determinar la ubicación de memoria resultante leyendo el registro de dirección de error del bus ( ).BFARVALID
Bus Fault Address Register,BFAR
Bus 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 llamaunprecise 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 llamaprecise bus fault
.
Bus Fault Status Register
Ubicado 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 fault
tiene 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 register
configurar 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. DACCVIOL
Si el bit de acceso ilegal a datos ( ) o la infracción de acceso a instrucciones ( bit) en el registro de estado IACCVIOL
es 1, el contador del programa de pila puede ubicar el código incorrecto. Si se establece el bit MFSR
in , la ubicación de la dirección de memoria que causó el error MMARVALID
también se puede determinar a partir del registro de dirección de administración de memoria ( ) en la NVIC .Memory Management Address Register,MMAR
MFSR
El 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 faults
Puede 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 admiteARM state
; Cortex-M3 no lo admite y se producirá un error de uso si cambia) - devolución de interrupción no válida (
LR
el registro contiene un valor no válido/incorrecto) load
Uso de múltiples /store
directivas 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 faults
Los controladores Bus fault
tienen las mismas características que , y para habilitarlos Usage faults
, debe establecer bits en el System Handler Control and State register
NVIC 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 BX
la instrucción o BLX
para 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 POP
valor de PC ya esté en la pila, y el LSB es 0. En estos casos, Usage fault
se generará, se establecerá UFSR
el registro .INVSTATE
- El bit LSB más bajo es 1 para indicar el uso de
Thumb state
UFSR
El 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_RETURN Una 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 faults
y no tiene un controlador de Bus faults
errores Memory management faults
correspondiente, se generará uno Hard fault
. vector fetch
Ademá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 fetch
causado por . De lo contrario, Hard fault
su controlador de errores debe verificar algo más FSRs
para determinar Hard fault
la causa.
HFSR
El 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 faults yMemory management faults |
29:2 | - | - | - | - |
1 | VECTBL | L/E | 0 | indica que el error es vector fetch causado por |
- | - | - | - | - |