Pregunta

Quiero saber la diferencia entre FIQ y IRQ interrupción del sistema de cualquier microprocesador, por ejemplo:. ARM926EJ

¿Fue útil?

Solución

Una característica de las CPU ARM modernos (y algunos otros).

A partir de la patente:

  

Un método de realizar una rápida   interrumpir en un procesador de datos digitales   que tiene la capacidad de manejar más   que se proporciona una interrupción. Cuando una   solicitud de interrupción rápida se recibe una   El indicador se establece y el contador de programa   y los registros de código de condición son   almacenado en una pila. Al final de   interrumpir el servicio de rutina de la devolución   de instrucciones recupera de interrupción   el registro de código de condición que   Contiene el estado de lo digital   procesador de datos y comprueba para ver   si el indicador se ha establecido o no.   Si se establece el indicador que indica que una   rápida interrupción fue atendida y   por tanto, sólo el contador de programa es   unstacked.

En otras palabras, un FIQ es sólo una solicitud de interrupción de mayor prioridad, que tiene prioridad mediante la desactivación de IRQ y otros manipuladores FIQ durante el servicio de solicitudes. Por lo tanto, no hay otras interrupciones pueden ocurrir durante el procesamiento de la interrupción FIQ activo.

Otros consejos

llamadas ARM FIQ el rápida interrupción , con la implicación de que IRQ es prioridad normal . En cualquier sistema real, habrá muchas más fuentes de interrupciones que sólo dos dispositivos y por lo tanto habrá algún controlador externo interrupción de hardware que permite el enmascaramiento, la priorización etc. de estos múltiples fuentes y que acciona 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 sistemas redundantes y muchos no utilizan nFIQ en absoluto, o lo utilizan de una manera análoga a la no enmascarable (NMI) interrupción de encontrar en otros procesadores (aunque FIQ es enmascarable software en la mayoría de los procesadores ARM).

  

Entonces, ¿por qué la llamada ARM FIQ "rápida"?

  1. Modo FIQ tiene su propio dedicado peraltada registros, r8-r14. R14 es el registro de enlace que mantiene la dirección de retorno (4) de la FIQ. Pero si el controlador de la FIQ es capaz de ser escrita de tal manera que sólo utiliza r8-r13, puede tomar ventaja de estos registros en bancos de dos maneras:
    • Una es que no incurre en los gastos generales de empujar y hacer estallar los registros que son utilizados por la rutina de servicio de interrupción (ISR). Esto puede ahorrar una cantidad significativa de ciclos en la entrada y la salida a la ISR.
    • Además, el controlador puede depender de los valores que persiste en los registros de una llamada a la siguiente, de manera que, por ejemplo, r8 puede ser utilizado como un puntero a un dispositivo de hardware y el controlador puede confiar en el mismo valor de estar en r8 la siguiente vez que se llama.
  2. ubicación FIQ al final de la tabla de excepción vector (0x1C) significa que si el código de controlador de FIQ se coloca directamente en el extremo de la mesa de vector, no se requiere ninguna rama - el código se puede ejecutar directamente desde 0x1C. Esto ahorra unos cuantos ciclos en la entrada a la ISR.
  3. FIQ tiene mayor prioridad que IRQ. Esto significa que cuando el núcleo exceptúa de la FIQ, automáticamente máscaras fuera IRQ. Una IRQ no puede interrumpir el manejador de la FIQ. Lo contrario no es cierto - el IRQ no enmascara FIQs y por lo que el controlador de FIQ (si se usa) puede interrumpir el IRQ. Adicionalmente, si ambas solicitudes IRQ y FIQ se producen al mismo tiempo, el núcleo se ocupará de la FIQ en primer lugar.
  

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

  1. FIQ código del controlador normalmente no puede ser escrito en C - tiene que ser escrito directamente en lenguaje ensamblador. Si usted se preocupa lo suficiente sobre el rendimiento ISR a querer utilizar la FIQ, es probable que no quieren dejar de algunos ciclos en la tabla mediante la codificación en C, en cualquier caso, pero lo más importante el compilador de C no van a producir código que sigue a la restricción de usando sólo registra r8-r13. Código producido por un compilador de C compatible con el estándar ATPCS procedimiento de llamada de ARM en vez utilizará registros r0-r3 para los valores de cero y no producirán la cpsr correcta restauración de código de retorno al final de la función.
  2. Todo el hardware controlador de interrupciones es típicamente en el pin IRQ. El uso de la FIQ sólo tiene sentido si tiene una sola fuente más alta prioridad de interrupción conectado a la entrada NFIQ y muchos sistemas no tienen una fuente prioritaria de forma permanente más alta sola. No hay un valor que conecta múltiples fuentes a la FIQ y luego tener el software de priorizar entre ellos, ya que elimina casi todas las ventajas de la FIQ tiene sobre IRQ.

FIQ o rápida interrupción se refiere a menudo como Soft DMA en algunas referencias ARM.
Características de la FIQ son:

  1. modo independiente con registro peraltada incluyendo pila, enlace de registro y R8-R12.
  2. independiente FIQ bit de habilitación / desactivar.
  3. Cola de la tabla de vectores (que está siempre en la memoria caché y se asigna por la MMU).

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

una demo velocidad en 'C'

Algunos han citado la dificultad de codificación en ensamblador para manejar la FIQ. gcc tiene anotaciones de codificar una FIQ manejador. Aquí es 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 lo siguiente casi bueno ensamblador,

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 ensamblador en 0x1c podría ser similar,

   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 tiene probablemente un poco listo, pero el código para hacer una alta velocidad de blandos DMA con el FIQ sólo sería 10-20 instrucciones. El código principal tiene que sondear el r10 FIQ para determinar cuando se acaba la memoria intermedia. Principal (código de no interrupción) puede transferir y configurar la peraltada FIQ registros mediante el uso de la instrucción msr para cambiar a modo FIQ y transferir no peraltada R0-R7 a la peraltada R8-R13 registra.

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

FIQ es cuestión de velocidad, no se debe tener en cuenta que si usted no está seguro en la codificación en ensamblador (o dispuesto a dedicar el tiempo). Ensamblador escrito por un programador infinitamente ejecución será más rápido que un compilador. Tener GCC Assist puede ayudar a un novato.

Latencia

FIQ ha separado una máscara de bits que está permitido casi ubicua. En las CPUs ARM anteriores (como el ARM926EJ), algunas operaciones atómicas tuvieron que ser implementado mediante el enmascaramiento de interrupciones. Aún así, incluso con las CPU Cortex más avanzados, hay ocasiones en las que un sistema operativo va a enmascarar las interrupciones. A menudo, el tiempo de servicio no es crítico para una interrupción, pero el tiempo entre la señalización y el mantenimiento. Aquí, el FIQ también tiene una ventaja.

Debilidad

La FIQ no es escalable. Con el fin de utilizar múltiples fuentes FIQ, los registros en bancos deben ser compartidos entre las rutinas de interrupción. Además, hay que añadir código para determinar la causa de la interrupción / FIQ. La FIQ es generalmente un un pony truco .

Si su interrupción es muy complejo (controlador de red, USB, etc), entonces la FIQ probablemente tiene poco sentido. Esta es básicamente la misma declaración como multiplexación las interrupciones. El peraltada registros dan 6 variables de uso gratuito que Nunca cargar desde la memoria . Registro son más rápidos que la memoria. Los registros son más rápido que L2-cache. Los registros son más rápido que L1-cache. Los registros son rápidos. Si no se puede escribir una rutina que se ejecuta con 6 variables, entonces el FIQ no es adecuado. Nota: Puede hacer doble deber algún registro con cambios gira y que están libres en el brazo, si utiliza valores de 16 bits

.

Es evidente que la FIQ es más compleja. los desarrolladores de OS quieren dar soporte a múltiples fuentes de interrupción. requisitos del cliente para un FIQ variará y, a menudo se dan cuenta de que sólo debe dejar que el cliente rodar su propia . Por lo general, el apoyo a una FIQ se limita como cualquier apoyo es que pueda menoscabar el principal beneficio, VELOCIDAD .

Resumen

No Bash mi amigo el FIQ . Es un programa del sistemaers un truco en contra de hardware estúpida. No es para todos, pero tiene su lugar. Cuando todos los otros intentos para reducir la latencia y aumentar la frecuencia de servicio ISR ha fallado, el FIQ puede ser su única opción (o un mejor equipo de hardware).

También posible utilizar como un pánico interrumpir en algunas aplicaciones críticas de seguridad.

Caos ya ha respondido bien, pero un punto adicional no cubierta hasta ahora es que la FIQ se encuentra al final de la tabla de vectores y por lo que es común / tradicionales apenas comenzar la rutina allí mismo, mientras que el vector IRQ es por lo general sólo eso . (Es decir, un salto a algún otro lugar). Evitando de esa rama adicional inmediatamente después de un interruptor de alijo y el contexto completo es una ligera ganancia de velocidad.

FIQ es más alta prioridad, y se puede introducir mientras que otro IRQ está siendo manejado. El recurso más crítico (s) son manejados por FIQ de, el resto son manejados por la IRQ.

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

Creo que esto es lo que busca:

http: //newsgroups.derkeiler .com / Archivo / Comp / comp.sys.arm / 2005-09 / msg00084.html

Esencialmente, FIQ será de la más alta prioridad con múltiple, menores fuentes de IRQ prioritarios.

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

FIQs son una prioridad más alta, sin duda, los puntos restantes no estoy seguro ..... FIQs apoyarán alta velocidad de transferencia de datos (o) el procesamiento de canal, donde se requiere procesos de datos de alta velocidad que utilizamos FIQs y generalmente estamos acostumbrados IRQ Handlling interrupción normal.

Depende de cómo diseñamos el manejador de interrupciones, como FIQ es, al fin, que no necesite una instrucción de salto, también tiene conjunto único de R8-R14 registra así que la próxima vez que vuelva a FIQ de interrupción que no necesitamos para empujar / pop-up de la pila. Por supuesto que ahorra algunos ciclos, pero de nuevo no es aconsejable tener más manejadores sirven uno 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 funcionar a la misma frecuencia de la CPU, por lo que deben estar en ejecución a la misma velocidad.

Esto puede ser incorrecto. Todo lo que sé es que FIQ significa rápido Solicitud de interrupción IRQ y que es sinónimo de solicitud de interrupción. A juzgar por estos nombres, voy a suponer que un FIQ será manejado (arrojado?) Más rápido que una IRQ. Probablemente tiene algo que ver con el diseño del procesador donde un FIQ interrumpirá el proceso más rápido que una IRQ. Me disculpo si estoy equivocado, pero lo hago normalmente de programación de alto nivel, sólo estoy adivinando en este momento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top