arm - ¿Cuál es la diferencia entre el sistema de interrupción FIQ e IRQ?
interrupt drivers (11)
Chaos ya ha respondido bien, pero un punto adicional no cubierto hasta ahora es que FIQ está al final de la tabla de vectores, por lo que es común / tradicional comenzar la rutina allí mismo, mientras que el vector IRQ suele ser solo eso. (es decir, un salto a otro lugar). Evitar esa rama adicional inmediatamente después de un alijo completo e interruptor de contexto es un ligero aumento de velocidad.
Quiero saber la diferencia entre el sistema de interrupción FIQ e IRQ en cualquier microprocesador, por ejemplo: ARM926EJ.
Creo que esto es lo que estás buscando:
http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.arm/2005-09/msg00084.html
Esencialmente, FIQ tendrá la más alta prioridad con múltiples fuentes de IRQ de prioridad más baja.
Depende de cómo diseñamos controladores de interrupción, como FIQ finalmente no necesita una instrucción de bifurcación, también tiene un conjunto único de registros r8-r14, así que la próxima vez que regresemos a la interrupción FIQ no necesitamos empujar / abrir el menú emergente. apilar. Por supuesto, ahorra algunos ciclos, pero una vez más no es aconsejable tener más controladores sirviendo un FIQ y sí FIQ tiene más prioridad, pero no hay ninguna razón para decir que maneja la interrupción más rápido, tanto IRQ / FIQ se ejecutan en la misma frecuencia de CPU, Entonces deben estar funcionando a la misma velocidad.
Esto puede estar mal. Todo lo que sé es que FIQ significa Fast Interrupt Request y que IRQ significa Interrupt Request. A juzgar por estos nombres, supongo que un FIQ será manejado (lanzado?) Más rápido que un IRQ. Probablemente tiene algo que ver con el diseño del procesador donde un FIQ interrumpirá el proceso más rápido que un IRQ. Me disculpo si me equivoco, pero normalmente hago programación de alto nivel, solo estoy adivinando en este momento.
FIQ es de mayor prioridad, y se puede introducir mientras se maneja otra IRQ. Los recursos más críticos son manejados por FIQ, el resto son manejados por IRQ.
Los FIQ son de mayor prioridad, sin duda, los puntos restantes no estoy seguro ... Los FIQ soportarán la transferencia de datos de alta velocidad (o) el procesamiento de canales, donde se requieren procesos de datos de alta velocidad, usamos FIQ y generalmente se usan IRQ. .
No hay magia sobre FIQ. FIQ solo puede interrumpir cualquier otra IRQ que se esté atendiendo, esta es la razón por la cual se llama ''rápido''. El sistema reacciona más rápido en estas interrupciones, pero el resto es el mismo.
Una característica de las modernas CPU ARM (y algunas otras).
De la patente:
Se proporciona un método para realizar una interrupción rápida en un procesador de datos digitales que tiene la capacidad de manejar más de una interrupción. Cuando se recibe una solicitud de interrupción rápida, se establece un indicador y los registros del código del estado y el contador del programa se almacenan en una pila. Al final de la rutina de servicio de interrupción, el retorno de las instrucciones de interrupción recupera el registro del código de condición que contiene el estado del procesador digital de datos y verifica si el indicador se ha configurado o no. Si el indicador está configurado, indica que se atendió una interrupción rápida y, por lo tanto, solo el contador del programa está desapilado.
En otras palabras, un FIQ es solo una solicitud de interrupción de prioridad más alta, que se prioriza inhabilitando IRQ y otros controladores FIQ durante el servicio de solicitud. Por lo tanto, no pueden ocurrir otras interrupciones durante el procesamiento de la interrupción FIQ activa.
otro motivo es en el caso de FIQ, se necesita un número de registro menor para empujar en la pila, el modo FIQ tiene registros de R8 a R14_fiq
FIQ o interrupción rápida a menudo se denomina Soft DMA en algunas referencias ARM.
Las características del FIQ son,
- Modo independiente con registro bancarizado que incluye pila, registro de enlace y R8-R12.
- Separar FIQ habilitar / deshabilitar bit.
- Cola de tabla vectorial (que siempre está en caché y mapeada por MMU).
La última característica también ofrece una ligera ventaja sobre una IRQ que debe ramificarse.
Una demostración de velocidad en ''C''
Algunos han citado la dificultad de la codificación en el ensamblador para manejar el FIQ. gcc
tiene anotaciones para codificar un controlador FIQ . Aquí hay un ejemplo,
void __attribute__ ((interrupt ("FIQ"))) fiq_handler(void)
{
/* registers set previously by FIQ setup. */
register volatile char *src asm ("r8"); /* A source buffer to transfer. */
register char *uart asm ("r9"); /* pointer to uart tx register. */
register int size asm ("r10"); /* Size of buffer remaining. */
if(size--) {
*uart = *src++;
}
}
Esto se traduce en el siguiente ensamblador casi bueno,
00000000 <fiq_handler>:
0: e35a0000 cmp sl, #0
4: e52d3004 push {r3} ; use r11, r12, etc as scratch.
8: 15d83000 ldrbne r3, [r8]
c: 15c93000 strbne r3, [r9]
10: e49d3004 pop {r3} ; same thing.
14: e25ef004 subs pc, lr, #4
La rutina de ensamblado en 0x1c
podría verse así,
tst r10, #0 ; counter zero?
ldrbne r11, [r8] ; get character.
subne r10, #1 ; decrement count
strbne r11, [r9] ; write to uart
subs pc, lr, #4 ; return from FIQ.
Un UART real probablemente tiene un bit listo, pero el código para hacer un DMA suave de alta velocidad con el FIQ solo sería de 10-20 instrucciones. El código principal necesita sondear el FIQ r10
para determinar cuándo termina el búfer. Main (código sin interrupción) puede transferir y configurar los registros FIQ almacenados utilizando la instrucción msr
para cambiar al modo FIQ y transferir el R0-R7 no bancarizado a los registros bancarios R8-R13.
Típicamente, la latencia de interrupción de RTOS será de 500-1000 instrucciones. Para Linux, tal vez 2000-10000 instrucciones. Real DMA siempre es preferible, sin embargo, para interrupciones simples de alta frecuencia (como una transferencia de buffer), el FIQ puede proporcionar una solución.
Como el FIQ se basa en la velocidad, no debe considerarlo si no está seguro al codificar en ensamblador (o si está dispuesto a dedicarle tiempo). El ensamblador escrito por un programador infinitamente en ejecución será más rápido que un compilador. Tener asistencia de GCC puede ayudar a un novato.
Estado latente
Como el FIQ tiene un bit de máscara separado, está habilitado de manera casi ubicua. En CPUs ARM anteriores (como ARM926EJ), algunas operaciones atómicas tuvieron que implementarse mediante el enmascaramiento de interrupciones. Incluso con las CPU Cortex más avanzadas, hay ocasiones en que un SO enmascara las interrupciones. A menudo, el tiempo de servicio no es crítico para una interrupción, sino el tiempo entre la señalización y el servicio. Aquí, el FIQ también tiene una ventaja.
Debilidad
El FIQ no es escalable. Para usar múltiples fuentes FIQ
, los registros bancarizados deben ser compartidos entre las rutinas de interrupción. Además, se debe agregar código para determinar qué causó la interrupción / FIQ. El FIQ generalmente es un pony de un solo truco .
Si su interrupción es muy compleja (controlador de red, USB, etc.), entonces el FIQ probablemente tenga poco sentido. Esta es básicamente la misma declaración que multiplexar las interrupciones. Los registros bancarizados dan 6 variables libres para usar que nunca cargan desde la memoria . Registrarse es más rápido que la memoria. Los registros son más rápidos que L2-caché. Los registros son más rápidos que L1-caché. Los registros son rápidos. Si no puede escribir una rutina que se ejecuta con 6 variables, entonces el FIQ no es adecuado. Nota: Puede duplicar el deber de registrarse con los cambios y rotaciones que están libres en el ARM, si usa valores de 16 bits.
Obviamente, el FIQ es más complejo. Los desarrolladores de sistema operativo quieren admitir múltiples fuentes de interrupción. Los requisitos del cliente para un FIQ variarán y, a menudo, se dan cuenta de que deben dejar que el cliente haga lo propio . Por lo general, el soporte para un FIQ es limitado, ya que cualquier soporte puede perjudicar el beneficio principal, SPEED .
Resumen
No golpees a mi amigo el FIQ . Es un programa de los programadores un truco contra el hardware estúpido. No es para todos, pero tiene su lugar. Cuando todos los demás intentos de reducir la latencia y aumentar la frecuencia del servicio ISR han fallado, el FIQ puede ser su única opción (o un mejor equipo de hardware).
También es posible usarlo como una interrupción de pánico en algunas aplicaciones críticas de seguridad.
ARM llama a FIQ
la interrupción rápida , con la implicación de que IRQ
es una prioridad normal . En cualquier sistema real, habrá muchas más fuentes de interrupciones que solo dos dispositivos y, por lo tanto, habrá algún controlador de interrupción de hardware externo que permita el enmascaramiento, la priorización, etc. de estas múltiples fuentes y que dirija las líneas de solicitud de interrupción al procesador.
Hasta cierto punto, esto hace que la distinción entre los dos modos de interrupción sea redundante y muchos sistemas no usan nFIQ
en absoluto, o lo usan de forma análoga a la interrupción no enmascarable ( NMI
) encontrada en otros procesadores (aunque FIQ
es software enmascarable en la mayoría de los procesadores ARM).
Entonces, ¿por qué ARM llama a FIQ "rápido"?
- El modo FIQ tiene sus propios registros bancarizados dedicados,
r8-r14
. R14 es el registro de enlace que contiene la dirección de retorno (+4) del FIQ. Pero si su manejador FIQ puede escribirse de manera que solo user8-r13
, puede aprovechar estos registros bancarizados de dos maneras:- Una es que no incurre en gastos indirectos al presionar y hacer que aparezcan los registros que usa la rutina de servicio de interrupción (ISR). Esto puede ahorrar una cantidad significativa de ciclos tanto en la entrada como en la salida del ISR.
- Además, el controlador puede confiar en los valores que persisten en los registros de una llamada a la siguiente, de modo que, por ejemplo,
r8
se puede usar como un puntero a un dispositivo de hardware y el controlador puede confiar en que el mismo valor esté enr8
la próxima vez llamado.
- La ubicación de FIQ al final de la tabla de vectores de excepción (
0x1C
) significa que si el código del controlador de FIQ se coloca directamente al final de la tabla de vectores, no se requiere ninguna rama; el código se puede ejecutar directamente desde0x1C
. Esto ahorra unos pocos ciclos en la entrada al ISR. - FIQ tiene mayor prioridad que IRQ. Esto significa que cuando el núcleo toma una excepción FIQ, enmascara automáticamente las IRQ. Un IRQ no puede interrumpir el controlador FIQ. Lo contrario no es cierto: el IRQ no enmascara los FIQ, por lo que el controlador de FIQ (si se usa) puede interrumpir el IRQ. Además, si las solicitudes IRQ y FIQ ocurren al mismo tiempo, el núcleo tratará primero con el FIQ.
Entonces, ¿por qué muchos sistemas no usan FIQ?
- Por lo general, el código del controlador FIQ no puede escribirse en C; debe escribirse directamente en lenguaje ensamblador. Si le importa lo suficiente el rendimiento de ISR como para querer usar FIQ, probablemente no desee dejar algunos ciclos en la tabla codificando en C en cualquier caso, pero lo más importante es que el compilador de C no producirá código que siga la restricción de usando solo los registros
r8-r13
. El código producido por un compilador de C que cumpla con el estándar de llamada a procedimientoATPCS
de ARM usará en su lugar los registrosr0-r3
para los valorescpsr
y no producirá el código de retornocpsr
correcto al final de la función. - Todo el hardware del controlador de interrupción está típicamente en el pin IRQ. El uso de FIQ solo tiene sentido si tiene una sola fuente de interrupción de mayor prioridad conectada a la entrada de nFIQ y muchos sistemas no tienen una única fuente de máxima prioridad permanente. No hay ningún valor para conectar múltiples fuentes al FIQ y luego tener prioridades de software entre ellas ya que esto elimina casi todas las ventajas que el FIQ tiene sobre IRQ.