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

Je veux connaître la différence entre le système d’interruption FIQ et IRQ dans n’importe quel microprocesseur, par exemple: ARM926EJ.

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

    Du brevet:

    L’invention concerne un procédé permettant d’effectuer une interruption rapide dans un processeur de données numériques capable de traiter plus d’une interruption. Lorsqu’une demande d’interruption rapide est reçue, un indicateur est défini et les registres du compteur de programme et du code de condition sont stockés sur une stack. A la fin de la routine de traitement des interruptions, les instructions de retour d’interruption récupèrent le registre de code de condition qui contient l’état du processeur de données numériques et vérifient si l’indicateur a été défini ou non. Si l’indicateur est défini, cela indique qu’une interruption rapide a été traitée et que, par conséquent, seul le compteur de programme est désempilé.

    En d’autres termes, une FIQ est juste une demande d’interruption de priorité supérieure, qui est priorisée en désactivant l’IRQ et les autres gestionnaires FIQ lors de la gestion des requêtes. Par conséquent, aucune autre interruption ne peut se produire pendant le traitement de l’interruption FIQ active.

    ARM appelle FIQ l’ interruption rapide , ce qui implique que l’ IRQ est une priorité normale . Dans n’importe quel système réel, il y aura beaucoup plus de sources d’interruption que seulement deux périphériques et il y aura donc un contrôleur d’interruption matériel externe qui permettra de masquer, hiérarchiser, etc.

    Dans une certaine mesure, cela fait la distinction entre les deux modes d’interruption redondants et de nombreux systèmes qui n’utilisent pas nFIQ du tout, ou l’utilisent de manière analogue à l’interruption non masquable ( NMI ) présente sur d’autres processeurs 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 des registres utilisés par la routine de service d’interruption (ISR). Cela peut sauver un nombre important de cycles à l’entrée et à la sortie des ISR.
      • De plus, le gestionnaire peut s’appuyer sur des valeurs persistantes dans les registres d’un appel à l’autre, par exemple, r8 peut être utilisé comme pointeur sur un périphérique matériel et le gestionnaire peut compter sur la même valeur dans r8 la prochaine fois. appelé.
    2. L’emplacement FIQ à la fin de la table de vecteurs d’exception ( 0x1C ) signifie que si le code du gestionnaire FIQ est placé directement à la fin de la table vectorielle, aucune twig n’est requirejse – le code peut s’exécuter directement à partir de 0x1C . Cela économise quelques cycles à l’entrée dans les ISR.
    3. La FIQ a une priorité plus élevée que l’IRQ. Cela signifie que lorsque le kernel prend une exception FIQ, il masque automatiquement les IRQ. Un IRQ ne peut pas interrompre le gestionnaire FIQ. Le contraire n’est pas vrai – l’IRQ ne masque pas les FIQ et le gestionnaire FIQ (s’il est utilisé) peut interrompre l’IRQ. De plus, si les demandes d’IRQ et de FIQ se produisent simultanément, le kernel traitera d’abord de la FIQ.

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

    1. Le code du gestionnaire FIQ ne peut généralement pas être écrit en C – il doit être écrit directement en langage assembleur. Si vous voulez que les performances d’ISR soient compatibles avec FIQ, vous ne voudrez probablement pas laisser quelques cycles sur la table en codant C dans tous les cas, mais surtout, le compilateur C ne produira pas de code suivant la ressortingction sur en utilisant uniquement les registres r8-r13 . Le code produit par un compilateur C conforme à la ATPCS d’appel de procédure ATPCS d’ARM utilisera plutôt les registres r0-r3 pour les valeurs de scratch et ne produira pas le bon code retour de restauration 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 source d’interruption à priorité la plus élevée connectée à l’entrée nFIQ et que de nombreux systèmes ne disposent pas d’une source unique de priorité la plus élevée. Il n’y a pas de valeur à connecter plusieurs sources à la FIQ et à les classer par ordre de priorité, car cela supprime presque tous les avantages de la FIQ par rapport à l’IRQ.

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

    1. Mode séparé avec registre mis en banque comprenant la stack, le registre de liaison et R8-R12.
    2. Séparez le bit d’activation / désactivation FIQ.
    3. Queue de la table vectorielle (qui est toujours en cache et mappée par MMU).

    La dernière fonctionnalité donne également un léger avantage par rapport à une IRQ qui doit être branchée.

    Une démo rapide en ‘C’

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

     void __atsortingbute__ ((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 à l’assembleur presque bon suivant,

     00000000 : 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’assemblage à 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 prêt, mais le code pour créer un DMA logiciel à grande vitesse avec la FIQ ne serait que de 10 à 20 instructions. Le code principal doit interroger le FIQ r10 pour déterminer quand le tampon est terminé. Main (code de non-interruption) peut transférer et configurer les registres FIQ mis en banque en utilisant l’instruction msr pour passer en mode FIQ et transférer R0-R7 non mis en banque dans les registres R8-R13 mis en banque.

    Typiquement, la latence des interruptions RTOS sera de 500 à 1000 instructions. Pour Linux, il peut s’agir de 2000-10000 instructions. Le vrai DMA est toujours préférable, cependant, pour les interruptions simples à haute fréquence (comme un transfert de tampon), la FIQ peut fournir une solution.

    Comme la FIQ concerne la vitesse, vous ne devriez pas en tenir compte si vous n’êtes pas sûr de coder dans l’assembleur (ou si vous souhaitez y consacrer du temps). L’assembleur écrit par un programmeur à exécution infinie sera plus rapide qu’un compilateur. Aider GCC peut aider un novice.

    Latence

    Comme la FIQ a un bit de masque séparé, il est activé presque partout. Sur les processeurs ARM antérieurs (tels que l’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 des interruptions. Souvent, le temps de service n’est pas critique pour une interruption, mais le temps entre la signalisation et la maintenance. Ici, la FIQ a aussi un avantage.

    La faiblesse

    La FIQ n’est pas évolutive. Pour utiliser plusieurs sources FIQ , les registres mis en banque doivent être partagés entre les routines d’interruption. De plus, le code doit être ajouté pour déterminer ce qui a causé l’interruption / FIQ. La FIQ est généralement un poney à un tour .

    Si votre interruption est très complexe (pilote réseau, USB, etc.), alors la FIQ a peu de sens. C’est fondamentalement la même déclaration que le multiplexage des interruptions. Les registres en banque donnent 6 variables libres à utiliser qui ne se chargent jamais de la mémoire . Register est plus rapide que la mémoire. Les registres sont plus rapides que le cache L2. Les registres sont plus rapides que le cache L1. Les registres sont rapides. Si vous ne pouvez pas écrire une routine qui fonctionne avec 6 variables, la FIQ ne convient pas. Note: Vous pouvez doubler un certain registre avec des décalages et des rotations qui sont libres sur le arm, si vous utilisez des valeurs de 16 bits.

    De toute évidence, la FIQ est plus complexe. Les développeurs de systèmes d’exploitation souhaitent prendre en charge plusieurs sources d’interruption. Les exigences des clients pour une FIQ varieront et souvent ils se rendront compte qu’ils doivent simplement laisser le client faire leurs propres choix . Habituellement, le soutien à une FIQ est limité, car tout soutien risque de nuire au principal avantage, SPEED .

    Résumé

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

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

    Le chaos a déjà bien répondu, mais un point supplémentaire non couvert jusqu’à présent est que FIQ est à la fin de la table vectorielle et qu’il est donc courant / traditionnel de commencer la routine juste là, alors que le vecteur IRQ est généralement juste. (c’est-à-dire un saut vers un autre endroit). Éviter cette twig supplémentaire immédiatement après un changement complet de cache et de contexte est un léger gain de vitesse.

    La FIQ est prioritaire et peut être introduite pendant qu’une autre IRQ est en cours de traitement. Les ressources les plus critiques sont gérées par la FIQ, les autres sont traitées par les IRQ.

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

    Je crois que c’est ce que vous recherchez:

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

    Essentiellement, FIQ aura la plus haute priorité avec plusieurs sources d’IRQ moins prioritaires.

    Pas de magie sur FIQ. La FIQ peut simplement interrompre toute autre IRQ en cours de traitement, c’est pourquoi elle est appelée «rapide». Le système réagit plus rapidement sur ces interruptions, mais le rest est identique.

    Les FIQ sont plus prioritaires, sans doute, les points restants Je ne suis pas sûr ….. Les FIQ supporteront le transfert de données à haut débit (ou) le traitement de données à haute vitesse est requirejs, nous utilisons généralement les FIQ. .

    Cela dépend de la façon dont nous concevons les gestionnaires d’interruptions, car la FIQ est enfin inutile, il possède également un ensemble unique de registres r8-r14. La prochaine fois que nous reviendrons à l’interruption FIQ, nous n’aurons pas besoin emstackr. Bien sûr, cela économise certains cycles, mais encore une fois, il n’est pas judicieux d’avoir plus de gestionnaires desservant une seule FIQ et oui la FIQ a plus de priorité, mais il n’y a aucune raison de dire qu’elle gère l’interruption plus rapidement. Ils doivent donc fonctionner à la même vitesse.

    Cela peut être faux. Tout ce que je sais, c’est que FIQ signifie Fast Interrupt Request et que IRQ signifie Interrupt Request. À en juger par ces noms, je devine qu’une FIQ sera traitée (lancée?) Plus rapidement qu’une IRQ. Cela a probablement quelque chose à voir avec la conception du processeur où une FIQ interrompt le processus plus rapidement qu’une IRQ. Je m’excuse si je me trompe, mais je fais normalement de la programmation de haut niveau, je devine juste maintenant.