web-dev-qa-db-fra.com

Quelle est la différence entre un système d’interruption FIQ et IRQ?

Je souhaite connaître la différence entre les systèmes d’interruption FIQ et IRQ dans Tout microprocesseur, par exemple: ARM926EJ.

67
Renjith G

Une caractéristique des processeurs modernes ARM (et quelques autres).

Du brevet:

Une méthode d'exécution rapide interruption dans un processeur de données numériques ayant la capacité de gérer plus qu'une interruption est fournie. Lorsqu'un Une demande d'interruption rapide est reçue a le drapeau est défini et le compteur de programme et les registres de code de condition sont stocké sur une pile. À la fin de interrompre la routine d'entretien le retour à partir d'instructions d'interruption récupère le code de condition enregistrent lequel contient le statut du numérique processeur de données et vérifie pour voir si le drapeau a été défini ou non . Si le drapeau est défini, il indique que interruption rapide a été réparé et par conséquent, seul le compteur de programme est non empilé.

En d'autres termes, une requête FIQ est simplement une demande d'interruption de priorité supérieure, priorisée en désactivant les gestionnaires IRQ et autres gestionnaires FIQ lors du traitement des demandes. Par conséquent, aucune autre interruption ne peut se produire pendant le traitement de l'interruption FIQ active.

59
Chaos

ARM appelle FIQ l'interruption rapide, ce qui implique que IRQ est priorité normale. Dans tout système réel, il y aura beaucoup plus de sources d'interruptions que deux dispositifs et il y aura donc un contrôleur d'interruption matériel externe qui permet le masquage, la hiérarchisation, etc. de ces sources multiples et qui dirige les lignes de demande d'interruption vers le processeur.

Dans une certaine mesure, cela rend la distinction entre les deux modes d'interruption redondante et de nombreux systèmes n'utilisent pas du tout nFIQ, ou l'utilisent d'une manière analogue à l'interruption non masquable (NMI) trouvée sur d'autres processeurs (bien que FIQ soit un logiciel masquable sur la plupart des processeurs ARM).

Alors, pourquoi ARM appelle-t-il FIQ "rapidement"?

  1. Le mode FIQ possède ses propres registres mis en banque, r8-r14. R14 est le registre de liens qui contient l'adresse de retour (+4) de la FIQ. Mais si votre gestionnaire FIQ peut être écrit de telle sorte qu’il utilise uniquement r8-r13, il peut tirer parti de ces registres mis en banque de deux manières:
    • La première est qu’elle n’entraîne pas la surcharge de repousser ou d’écraser les registres utilisés par la routine de service d’interruption (ISR). Cela peut économiser un nombre important de cycles lors de l'entrée et de la sortie dans l'ISR.
    • De plus, le gestionnaire peut s’appuyer sur les valeurs qui persistent dans les registres d’un appel à l’autre, de sorte que, par exemple, r8 puisse être utilisé comme pointeur sur un périphérique matériel et que le gestionnaire puisse s’appuyer sur la même valeur dans r8 la prochaine fois. appelé.
  2. L'emplacement FIQ à la fin de la table des vecteurs d'exception (0x1C) signifie que si le code du gestionnaire FIQ est placé directement à la fin de la table des vecteurs, aucune branche n'est requise - le code peut être exécuté directement à partir de 0x1C. Cela économise quelques cycles à l'entrée dans l'ISR.
  3. La FIQ a une priorité plus élevée que l'IRQ. Cela signifie que lorsque le noyau prend une exception FIQ, il masque automatiquement les IRQ. Une IRQ ne peut pas interrompre le gestionnaire FIQ. L'inverse n'est pas vrai - l'IRQ ne masque pas les FIQ et le gestionnaire FIQ (le cas échéant) peut interrompre l'IRQ. De plus, si les requêtes IRQ et FIQ se produisent simultanément, le noyau traite d’abord avec la FIQ.

Alors, pourquoi de nombreux systèmes n'utilisent-ils pas la FIQ?

  1. Le code du gestionnaire FIQ ne peut généralement pas être écrit en C - il doit être écrit directement en langage Assembly. Si vous vous souciez suffisamment des performances ISR pour vouloir utiliser FIQ, vous ne voudriez probablement pas laisser quelques cycles sur la table en codant en C dans tous les cas, mais plus important encore, le compilateur C ne produira pas de code qui respecte la restriction en utilisant uniquement les registres r8-r13. Le code produit par un compilateur C conforme à la norme d'appel de procédure ATPCS d'ARM utilisera à la place les registres r0-r3 pour les valeurs de travail et ne produira pas le code de retour correct cpsr à la fin de la fonction.
  2. Tout le matériel du contrôleur d'interruption se trouve généralement sur la broche IRQ. L'utilisation de FIQ n'a de sens que si vous avez une seule source d'interruption de priorité la plus haute connectée à l'entrée nFIQ et que de nombreux systèmes ne disposent pas d'une source de priorité la plus élevée en permanence. Il n’ya aucune valeur de connecter plusieurs sources à la FIQ et d’avoir ensuite une priorité logicielle entre elles, car cela supprime presque tous les avantages de la FIQ par rapport à l’IRQ.
147
manav m-n

FIQ ou interruption rapide est souvent appelé Soft DMA dans certaines références ARM.
Les caractéristiques du FIQ sont,

  1. Mode séparé avec registre en banque comprenant pile, registre de liaison et R8-R12.
  2. Séparer le bit d'activation/désactivation FIQ.
  3. Queue de table de vecteurs (qui est toujours en cache et mappée par MMU).

La dernière fonctionnalité donne également un léger avantage par rapport à un IRQ qui doit créer une branche.

Une démo de vitesse en 'C'

Certains ont cité la difficulté de coder en assembleur pour traiter la FIQ. gcc a des annotations pour coder un gestionnaire FIQ. Voici un exemple,

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++;
    }
}

Cela se traduit par l'assembleur presque bon suivant,

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 routine d'assembleur à 0x1c pourrait ressembler,

   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 vrai UART a probablement un bit ready, mais le code pour créer un soft DMA à grande vitesse avec la FIQ ne serait que de 10 à 20 instructions. Le code principal doit interroger la FIQ r10 pour déterminer quand la mémoire tampon est terminée. Main (code non-interruption) peut transférer et configurer les registres FIQ en banque à l'aide de l'instruction msr pour passer en mode FIQ et transférer les fichiers R0-R7 non en banque à les registres R8-R13 en banque.

Généralement, la latence des interruptions RTOS correspond à 500-1000 instructions. Pour Linux, il peut s'agir d'instructions 2000-10000. Real DMA est toujours préférable, cependant, pour les interruptions simples à haute fréquence (comme un transfert de tampon), le FIQ peut fournir une solution.

Comme le FIQ est une question de vitesse, vous ne devriez pas en tenir compte si vous n'êtes pas sûr de coder en assembleur (ou prêt à consacrer du temps). Assembler écrit par un programmeur tournant à l'infini sera plus rapide qu'un compilateur. Avoir GCC aider peut aider un novice.

Latence

Comme le FIQ a un bit de masque séparé, il est presque automatiquement activé. Sur les processeurs ARM antérieurs (tels que le ARM926EJ), certaines opérations atomiques devaient être implémentées en masquant les interruptions. Même avec les processeurs Cortex les plus avancés, il arrive parfois qu'un système d'exploitation masque les interruptions. Souvent, le temps de maintenance n'est pas critique pour une interruption, mais le temps entre la signalisation et la maintenance. Ici, le FIQ a également un avantage.

La faiblesse

Le FIQ n'est pas évolutif. Pour utiliser plusieurs sources FIQ, les registres mis en banque doivent être partagés entre les routines d'interruption. De plus, un code doit être ajouté pour déterminer la cause de l'interruption/FIQ. Le FIQ est généralement un poney un tour.

Si votre interruption est très complexe (pilote de réseau, clé USB, etc.), la FIQ n’a probablement aucun sens. Ceci est fondamentalement la même déclaration que le multiplexage des interruptions. Les registres banked donnent 6 variables libres à utiliser qui ne charge jamais de mémoire. Les registres sont plus rapides que la mémoire. Les registres sont plus rapides que L2-cache. Les registres sont plus rapides que L1-cache. Les registres sont rapides. Si vous ne pouvez pas écrire une routine fonctionnant avec 6 variables, alors le FIQ ne convient pas. Remarque: vous pouvez faire double emploi avec certains registres avec shifts et rotates qui sont libres sur l’ARM, si vous utilisez des valeurs 16 bits.

Evidemment, le FIQ est plus complexe. Les développeurs de systèmes d'exploitation veulent prendre en charge plusieurs sources d'interruptions. Les exigences du client pour un FIQ varient et souvent, elles se rendent compte qu'elles doivent simplement laisser le client rouler leur propre. En général, le support pour un FIQ est limité, car tout support est susceptible de nuire au principal avantage, RAPID.

Résumé

Ne frappez pas mon ami le FIQ. C'est un truc des programmeurs système contre un matériel stupide. Ce n'est pas pour tout le monde, mais il a sa place. Lorsque toutes les autres tentatives visant à réduire le temps de latence et à augmenter la fréquence du service ISR ont échoué, le FIQ peut être votre seul choix (ou une meilleure équipe matérielle).

Il est également possible d’utiliser une interruption panique dans certaines applications critiques pour la sécurité.

63
artless noise

Le chaos a déjà bien répondu, mais un point supplémentaire non couvert à ce jour est que FIQ est à la fin du tableau des vecteurs. Il est donc courant/traditionnel de commencer simplement la routine ici, alors que le vecteur IRQ est généralement juste cela. (c.-à-d. un saut vers un autre endroit). Éviter cette branche supplémentaire immédiatement après un changement complet de cache et de contexte représente un léger gain de vitesse.

6
Pod

La priorité FIQ est plus élevée et peut être introduite pendant le traitement d'une autre IRQ. Les ressources les plus critiques sont traitées par les FIQ, les autres par les IRQ.

4
Sev

une autre raison est en cas de FIQ, un nombre moindre de registres est nécessaire pour pousser dans la pile, le mode FIQ a les registres R8 à R14_fiq

4
Ashok

Je crois que c'est ce que vous recherchez:

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

La FIQ aura essentiellement la priorité la plus élevée avec plusieurs sources d’IRQ de priorité inférieure.

1
AlbertoPL

Les FIQ ont une priorité plus élevée, il ne fait aucun doute que les points restants ne sont pas sûrs… Les FIQ prendront en charge le traitement de transfert de données à haute vitesse (ou), lorsque des processus de données à grande vitesse sont nécessaires, nous utilisons des FIQ et généralement les IRQ sont utilisées. .

1
Sriram

Pas de magie à propos de la FIQ. La FIQ peut simplement interrompre toute autre IRQ en cours de traitement, c'est pourquoi on l'appelle «rapide». Le système réagit plus rapidement sur ces interruptions mais le reste est identique.

1
mishmashru

Cela dépend de la façon dont nous concevons les gestionnaires d’interruptions, car FIQ est enfin, elle n’aura peut-être pas besoin d’une instruction de branche, mais elle possède également un ensemble unique de registres r8-r14. empiler. Bien sûr, cela économise quelques cycles, mais encore une fois, il n’est pas sage d’avoir plus de gestionnaires servant une seule FIQ et oui, la FIQ a plus de priorité, mais ce n’est pas une raison de dire qu’elle gère l’interruption plus rapidement, les deux IRQ/FIQ s’exécutant à la même fréquence CPU, Ils doivent donc fonctionner à la même vitesse.

0
Vijayendra Suman