La FIQ es una segunda instancia de la lógica de interrupción. Las diferencias clave son:
-
entrada de baja latencia, baja fluctuación de fase
La entrada para el FIQ está al final de la tabla vectorial, por lo que no se limita a una sola instrucción, lo que le permite comenzar el controlador de interrupciones directamente en este punto.
Además, se garantiza que el tiempo entre la confirmación de la FIQ y la ejecución de la primera instrucción en el manejador de la FIQ será fijo, por lo que es posible implementar un procesamiento exactamente cronometrado aquí. Si la instrucción actual necesita varios ciclos para completarse (por ejemplo, una instrucción ldm
), se cancela y reinicia después de que se complete el controlador.
Además, el modo FIQ tiene registros de sombra para r8
a r14
, mientras que los otros modos especiales ( IRQ
, SVC
, ABT
, UND
) solo tienen r13
y r14
shadowed, por lo que es posible mantener el estado local entre ejecuciones en registros, lo que a su vez acelera el inicio del controlador.
-
lógica de habilitación / deshabilitación separada
La FIQ puede permanecer habilitada mientras se ejecutan las IRQ (la lógica de la FIQ deshabilita las interrupciones, por lo que la FIQ tiene una prioridad más alta), lo que nuevamente es un guiño a las aplicaciones en tiempo real.
El Cortex-M implementa un manejo de prioridad dentro del controlador de interrupción, garantiza un tiempo constante para ingresar cualquier interrupción y elimina los registros ocultos, ya que ingresar el controlador de interrupciones requiere múltiples accesos a la memoria de todos modos.
Esto significa que la latencia de interrupción es significativamente más alta en Cortex-M, pero aún así es de baja fluctuación. Para interrupciones de alta frecuencia, esto es una desventaja significativa.
Por ejemplo, implementar un puerto serie de software en un controlador FIQ es fácil:
fiq_setup:
MOV r0, #MODE_FIQ
MOV cpsr, r0 // switch mode to FIQ
MOV r8, #GPIO_BASE // address of GPIO controller
MOV r9, #2 // Tx line high
MOV r0, #MODE_SVC
MOV cpsr, r0 // switch back to SVC mode
Esto prepara los registros r8
y r9
para cuando se ejecuta el controlador FIQ
fiq_handler:
str r9, [r8]
ldr r9, [r8]
// handle the bit read from the Rx line
// prepare the next bit for Tx
subs r15, r14, #-4
Si la rutina es lo suficientemente corta, puede configurar un temporizador con varios cientos de KHz que active una FIQ y seguir utilizando un porcentaje de un solo dígito de tiempo de CPU solamente.