¿Cuál es la diferencia entre el sistema de interrupción FIQ e IRQ?


Quiero saber la diferencia entre el sistema de interrupciones FIQ e IRQ en cualquier microprocesador, por ejemplo: ARM926EJ.

Author: manav m-n, 2009-06-10

11 answers

Una característica de las CPU ARM modernas (y algunas otras).

De la patente:

Un método para realizar un ayuno interrupción en un procesador de datos digital tener la capacidad de manejar más se proporciona más de una interrupción. Cuando un se recibe una solicitud de interrupción rápida bandera y el contador de programa y los registros de código de condición son almacenado en una pila. Al final de la interrumpir la rutina de mantenimiento la devolución desde instrucciones de interrupción recupera el registro de código de condición que contiene el estado de la digital procesador de datos y comprobaciones para ver si la bandera se ha establecido o no. Si el indicador está establecido, indica que un interrupción rápida fue atendida y por lo tanto, solo el contador de programa es sin estacas.

En otras palabras, un FIQ es solo una solicitud de interrupción de mayor prioridad, que se prioriza deshabilitando IRQ y otros manejadores de FIQ durante el servicio de solicitud. Por lo tanto, no se pueden producir otras interrupciones durante el procesamiento de la interrupción FIQ activa.

 59
Author: Chaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-19 04:58:03

ARM llama a FIQ la interrupción rápida, con la implicación de que IRQ es 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 enmascarar, priorizar, etc. de estas fuentes múltiples y que conduce las líneas de solicitud de interrupción al procesador.

Hasta cierto punto, esto hace la distinción entre los dos modos de interrupción redundante y muchos sistemas no usan nFIQ en absoluto, o lo usan de una manera análoga a la interrupción no enmascarable (NMI) que se encuentra 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"?

  1. El modo FIQ tiene sus propios registros bancarios dedicados, r8-r14. R14 es el registro de enlaces que contiene la dirección del remitente (+4) del FIQ. Pero si su controlador FIQ es capaz de ser escrito de tal manera que solo utiliza r8-r13, se puede aprovechar estos registros bancarios de dos maneras:
    • Una es que no incurre en la sobrecarga de empujar y hacer estallar los registros que son utilizados por la rutina de servicio de interrupción (ISR). Esto puede ahorrar un número significativo 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 puede usarse como un puntero a un dispositivo de hardware y el controlador puede confiar en el mismo el valor está en r8 la próxima vez que se llame.
  2. La ubicación FIQ al final de la tabla vectorial de excepción (0x1C) significa que si el código del controlador FIQ se coloca directamente al final de la tabla vectorial, no se requiere ninguna rama - el código puede ejecutarse directamente desde 0x1C. Esto ahorra algunos ciclos en la entrada al ISR.
  3. FIQ tiene mayor prioridad que IRQ. Esto significa que cuando el núcleo toma una excepción FIQ, automáticamente enmascara IRQs. Un IRQ no puede interrumpir el FIQ handler. Lo contrario no es cierto - la IRQ no enmascara FIQs y por lo tanto el controlador FIQ (si se utiliza) puede interrumpir la IRQ. Además, si las solicitudes de IRQ y FIQ se producen al mismo tiempo, el núcleo se ocupará primero del FIQ.

Entonces, ¿por qué muchos sistemas no usan FIQ?

  1. El código del manejador FIQ normalmente no se puede escribir en C - necesita ser escrito directamente en lenguaje ensamblador. Si se preocupa lo suficiente por el rendimiento de ISR para querer usar FIQ, probablemente no querría 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 usar solo registros r8-r13. El código producido por un compilador C que cumple con el estándar de llamada al procedimiento de ARM ATPCS utilizará en su lugar registros r0-r3 para los valores de cero y no producirá el cpsr correcto restaurando el código de retorno al final de la función.
  2. Todo el hardware del controlador de interrupciones suele estar encendido el pin IRQ. El uso de FIQ solo tiene sentido si tiene una única fuente de interrupción de mayor prioridad conectada a la entrada nFIQ y muchos sistemas no tienen una única fuente de prioridad permanente más alta. No hay valor para conectar varias fuentes al FIQ y luego hacer que el software priorice entre ellas, ya que esto elimina casi todas las ventajas que el FIQ tiene sobre IRQ.
 141
Author: manav m-n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-27 14:44:24

FIQ o fast interrupt a menudo se conoce como Soft DMA en algunas referencias de ARM.
Las características del FIQ son,

  1. Modo separado con registro bancario incluyendo pila, registro de enlace y R8-R12.
  2. Bit de activación/desactivación de FIQ separado.
  3. Cola de tabla vectorial (que siempre está en caché y mapeada por MMU).

La última característica también da una ligera ventaja sobre un IRQ que debe Sucursal.

Una demostración de velocidad en'C'

Algunos han citado la dificultad de codificar en ensamblador para manejar el FIQ. gcctiene anotaciones para codificar un controlador FIQ. He aquí 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 del ensamblador en 0x1c podría parecer,

   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 real UART probablemente tiene un bit listo, pero el código para hacer un DMA suave de alta velocidad con el FIQ solo sería 10-20 instrucciones. El código principal necesita sondear el FIQ r10 para determinar cuándo se ha terminado el búfer. Main (código sin interrupción) puede transferir y configurar los registros bancarizados FIQ utilizando la instrucción msr para cambiar al modo FIQ y transferir R0-R7 no bancarizados a los registros bancarizados R8-R13.

Normalmente la latencia de interrupción de RTOS será de 500-1000 instrucciones. Para Linux, tal vez 2000-10000 instrucciones. DMA real es siempre preferible, sin embargo, para alta frecuencia interrupciones simples (como una transferencia de búfer), el FIQ puede proporcionar una solución.

Como el FIQ se trata de velocidad, no deberías considerarlo si no estás seguro en la codificación en ensamblador (o dispuesto a dedicar el tiempo). Ensamblador escrito por un programador que se ejecuta infinitamente será más rápido que un compilador. Tener GCC assist puede ayudar a un novato.

Latencia

Como el FIQ tiene un bit de máscara separado, está casi omnipresente habilitado. En EL BRAZO anterior CPUs (como el ARM926EJ), algunas operaciones atómicas tuvieron que ser implementadas mediante interrupciones de enmascaramiento. Aún así, incluso con las CPU Cortex más avanzadas, hay ocasiones en las que un sistema operativo enmascarará 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 utilizar múltiples fuentes FIQ, los registros bancarios deben ser compartido entre rutinas de interrupción. Además, se debe agregar código para determinar qué causó la interrupción / FIQ. El FIQ es generalmente un one trick pony.

Si su interrupción es altamente compleja (controlador de red, USB, etc.), entonces el FIQ probablemente tiene poco sentido. Esto 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. Los registros son más rápidos que la memoria. Los registros son más rápidos que L2-cache. Los registros son más rápidos que L1-cache. Los registros son rápidos. Si no puede escribir una rutina que se ejecute con 6 variables, entonces el FIQ no es adecuado. Nota: Puede duplicar el trabajo de algunos registros con shiftsy rotates que están libres en el BRAZO, si utiliza valores de 16 bits.

, Obviamente, el FIQ es más complejo. Los desarrolladores de SO quieren admitir múltiples fuentes de interrupción. Requisitos del cliente para un FIQ variará y, a menudo, se dan cuenta de que solo deben dejar que el cliente ruede su propio. Generalmente para un soporte FIQ es limitado, ya que cualquier apoyo que puedan dañar el principal beneficio, VELOCIDAD.

Resumen

No golpees a mi amigo el FIQ . Es un sistema de 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, FIQ puede ser tu única opción (o un mejor equipo de hardware).

También es posible usar como una interrupción de pánico en algunas aplicaciones críticas de seguridad.

 59
Author: artless noise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-21 22:17:46

Chaos ya ha respondido bien, pero un punto adicional no cubierto hasta ahora es que FIQ está al final de la tabla vectorial y por lo tanto 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 extra inmediatamente después de un cambio completo de alijo y contexto es una ligera ganancia de velocidad.

 6
Author: Pod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-24 14:38:05

FIQ tiene mayor prioridad, y se puede introducir mientras se está manejando otra IRQ. Los recursos más críticos son manejados por FIQ, el resto son manejados por IRQ.

 4
Author: Sev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-19 04:56:49

Otra razón es en el caso de FIQ, se necesita un menor número de registros para empujar en la pila, el modo FIQ tiene registros R8 a R14_fiq

 4
Author: Ashok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-23 16:46:22

Creo que esto es lo que estás buscando:

Http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.arm/2005-09/msg00084.html

Esencialmente, FIQ será de la prioridad más alta con múltiples fuentes IRQ de menor prioridad.

 1
Author: AlbertoPL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-23 14:39:02

No hay magia sobre FIQ. FIQ solo puede interrumpir cualquier otra IRQ que se está sirviendo, es por eso que se llama 'rápido'. El sistema reacciona más rápido en estas interrupciones, pero el resto es el mismo.

 1
Author: mishmashru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-05 14:23:34

Los FIQs son de mayor prioridad, sin duda, los puntos restantes no estoy seguro..... FIQs soportará transferencia de datos de alta velocidad (o) procesamiento de canales, donde se requieren procesos de datos de alta velocidad utilizamos FIQs y generalmente IRQs se utilizan handlling de interrupción normal.

 1
Author: Sriram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-14 13:08:36

Depende de cómo diseñemos los manejadores de interrupciones, ya que FIQ por fin puede que no necesite una instrucción de rama, también tiene un conjunto único de registros r8-r14, por lo que la próxima vez que volvamos a la interrupción FIQ no necesitamos empujar/pop up la pila. Por supuesto que guarda algunos ciclos, pero de nuevo no es prudente tener más manejadores que sirven un FIQ y sí FIQ está teniendo más prioridad, pero no es 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, por lo que deben estar funcionando en la misma velocidad.

 0
Author: Vijayendra Suman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-21 15:05:31

Esto puede estar mal. Todo lo que sé es que FIQ significa Petición de Interrupción Rápida y que IRQ significa Petición de Interrupción. A juzgar por estos nombres, voy a adivinar que un FIQ será manejado(arrojado?) 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 nivel superior, solo estoy adivinando ahora mismo.

 -5
Author: mnuzzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-19 04:50:34