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 tout microprocesseur, par exemple: ARM926EJ.
11 réponses
Une caractéristique des processeurs ARM modernes (et quelques autres).
Du brevet:
Une méthode d'exécution d'un jeûne interruption dans un processeur de données numériques avoir la capacité de manipuler plus d'interruption est fourni. Lorsqu'un demande d'interruption rapide est reçu un le drapeau est défini et le compteur de programme et les registres de code de condition sont stockées sur une pile. À la fin de la interrompre la routine d'entretien le retour des instructions d'interruption récupère le état code Registre qui contient le statut du numérique processeur de données et vérifie si le drapeau a été défini ou non. Si l'indicateur est défini il indique qu'un l'interruption rapide a été réparée et par conséquent, seul le compteur de programme est non empilés.
En d'autres termes, un FIQ est juste une demande d'interruption de priorité plus élevée, qui est priorisée en désactivant IRQ et d'autres gestionnaires FIQ pendant l'entretien de la demande. Par conséquent, aucune autre interruption ne peut se produire pendant la traitement de l'interruption FIQ active.
BRAS appels FIQ
le rapide interruption, avec l'implication que IRQ
est priorité normale. Dans tout système réel, il y aura beaucoup plus de sources d'interruptions que seulement deux périphériques et il y aura donc un contrôleur d'interruption matériel externe qui permet le masquage,la priorisation, etc. de ces sources multiples et qui entraîne les lignes de demande d'interruption vers le processeur.
Dans une certaine mesure, cela fait la distinction entre les deux modes d'interruption redondant et de nombreux systèmes n'utilisent pas nFIQ
du tout, ou l'utilisent d'une manière analogue à l'interruption non masquable (NMI
) trouvée sur d'autres processeurs (bien que FIQ
soit masquable sur la plupart des processeurs ARM).
Alors pourquoi ARM appelle-t-il FIQ "rapide"?
- le mode FIQ a ses propres registres en banque dédiés,
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 n'utilise quer8-r13
, il peut tirer parti de ces registres mis en banque de deux façons:- L'un est qu'il n'encourt pas la surcharge de pousser et de faire éclater les registres utilisés par la routine de service d'interruption (ISR). Cela peut économiser un nombre important de cycles à l'entrée et à la sortie de L'ISR.
- Aussi, le gestionnaire peut s'appuyer sur les valeurs de la persistance dans les registres d'un appel à l'autre, de sorte que, par exemple
r8
peut être utilisé comme un pointeur vers un périphérique matériel et le gestionnaire peut compter sur le même valeur dansr8
la prochaine fois qu'elle est appelée.
- l'emplacement FIQ à la fin de la table vectorielle d'exception (
0x1C
) signifie que si le code du gestionnaire FIQ est placé directement à la fin de la table vectorielle, aucune branche n'est requise - le code peut s'exécuter directement à partir de0x1C
. Cela permet d'économiser quelques cycles à l'entrée dans L'ISR. - 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. Un IRQ ne peut pas interrompre le FIQ manipulateur. Le contraire n'est pas vrai - L'IRQ ne masque pas FIQ et donc le gestionnaire FIQ (si utilisé) peut interrompre L'IRQ. De plus, si les deux demandes IRQ et FIQ se produisent en même temps, le noyau traitera d'abord la FIQ.
Alors pourquoi de nombreux systèmes n'utilisent-ils pas FIQ?
- 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 vous souciez suffisamment des performances ISR pour vouloir utiliser FIQ, vous probablement ne voudrait 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 suit la restriction sur l'utilisation uniquement des registres
r8-r13
. Le Code produit par un compilateur C conforme à la norme D'appel de procédureATPCS
D'ARM utilisera à la place des registresr0-r3
pour les valeurs de scratch et ne produira pas le code de retourcpsr
correct à la fin de la fonction. - Tout le matériel du contrôleur d'interruption est généralement activé la broche IRQ. L'utilisation de FIQ n'a de sens que si vous avez une seule source d'interruption de priorité la plus élevée connectée à l'entrée nFIQ et que de nombreux systèmes n'ont pas une seule source de priorité la plus élevée en permanence. Il n'y a aucune valeur reliant plusieurs sources à la FIQ et ayant ensuite le logiciel prioriser entre eux car cela supprime presque tous les avantages de la FIQ a sur IRQ.
FIQ ou l'interruption rapideest souvent appelée DMA souple dans certaines références ARM.
Caractéristiques de la FIQ sont
- Mode séparé avec registre mis en banque, y compris la pile, le registre de liaison et R8-R12.
- bit d'activation/désactivation FIQ séparé.
- queue de la table vectorielle (qui est toujours en cache et mappée par MMU).
La dernière caractéristique donne également un léger avantage sur un IRQ {[12] } qui doit direction.
Une démo de vitesse en ' C '
Certains ont cité la difficulté de coder en assembleur pour gérer la FIQ. gcc
a des annotations pour coder un gestionnaireFIQ . 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 le suivant presque bon assembleur,
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 de l'assembleur à {[4] } peut 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 réel UART a probablement un prêt peu, mais le code pour faire une grande vitesse soft DMA, avec la FIQ ne serait 10-20 instructions. Le code principal doit interroger le FIQ r10
pour déterminer quand le tampon est terminé. Main (code sans 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 les registres R0-R7 non mis en banque vers les registres R8-R13 mis en banque.
Typiquement RTOS interruption latence sera 500-1000 instructions. Pour Linux, il peut-être 2000-10000 instructions. DMA réel est toujours préférable, cependant, pour haute fréquence des interruptions simples (comme un transfert de tampon), le FIQ peut fournir une solution.
Comme le FIQ concerne la vitesse, vous ne devriez pas le considérer si vous n'êtes pas sûr de coder dans l'assembleur (ou prêt à consacrer le temps). L'assembleur écrit par un programmeur en continu 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 omniprésent activé. Sur le bras plus tôt CPU (comme le ARM926EJ), certaines opérations atomiques ont dû être implémentées en masquant les interruptions. Même avec les processeurs Cortex les plus avancés, il y a des occasions où un système d'exploitation masquera les interruptions. Souvent le temps de service n'est pas critique pour une interruption, mais le temps entre la signalisation et l'entretien. Ici, le FIQ a aussi un avantage.
Faiblesse
Le FIQ n'est pas évolutif. Pour utiliser plusieurs sources FIQ
, les registres mis en banque doivent être partagé entre les routines d'interruption. En outre, le code doit être ajouté pour déterminer ce qui a causé l'interruption / FIQ. Le FIQ est généralement un poney d'un tour.
Si votre interruption est très complexe (pilote réseau, USB, etc.), le FIQ a probablement peu de sens. C'est fondamentalement la même déclaration que le multiplexage des interruptions. Les registresmis en banque donnent 6 variables libres à utiliser qui ne se chargent jamais de la mémoire . Registre 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 qui s'exécute avec 6 variables, alors le FIQ ne convient pas. REMARQUE: Vous pouvez doubler le devoir certains s'inscrivent avec shifts et rotates qui sont libres sur le bras, si vous utilisez des valeurs de 16 bits.
Évidemment, le FIQ est plus complexe. Les développeurs du système d'exploitation veulent prendre en charge plusieurs sources d'interruption. Exigences du client pour un FIQ varient et souvent, ils se rendent compte qu'ils faut juste laisser le client rouler leur propre. Habituellement, le support d'un FIQ est limité car tout support est susceptible de nuire à l'avantage principal, SPEED.
Résumé
Ne frappez pas mon ami le FIQ . Il est un programmeurs système un truc contre le matériel stupide. Ce n'est pas pour tout le monde, mais il a sa place. Lorsque toutes les autres tentatives pour réduire la 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 commepanique interruption dans certaines applications critiques de sécurité.
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 il est donc courant/traditionnel de commencer la routine là-bas, alors que le vecteur IRQ est généralement juste cela. (c'est à dire un saut à un autre endroit). Éviter cette branche supplémentaire immédiatement après un changement de planque et de contexte complet est un léger gain de vitesse.
FIQ est une priorité plus élevée, et peut être introduit pendant qu'un autre IRQ est en cours de traitement. Les ressources les plus critiques sont gérées par la FIQ, le reste par L'IRQ.
Une autre raison est dans le cas de FIQ, un nombre moindre de Registre est nécessaire pour pousser dans la pile, le mode FIQ a des registres R8 à r14_fiq
Je crois que c'est ce que vous cherchez:
Http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.arm/2005-09/msg00084.html
Essentiellement, FIQ sera de la plus haute priorité avec plusieurs sources IRQ de priorité inférieure.
Pas de magie sur FIQ. FIQ peut juste interrompre n'importe quel autre IRQ qui est servi,c'est pourquoi il est appelé "rapide". Le système réagit plus rapidement sur ces interruptions, mais le reste est le même.
Les FIQ sont une priorité plus élevée, sans aucun doute, les points restants Je ne suis pas sûr..... FIQs prendra en charge le transfert de données à haute vitesse (ou) traitement de canal, où les processus de données à haute vitesse est nécessaire, nous utilisons FIQs et généralement IRQs sont utilisés manipulation d'interruption normale.
Cela dépend de la façon dont nous concevons les gestionnaires d'interruption, car FIQ n'a finalement pas besoin d'une instruction de branche, il a également un ensemble unique de registres r8-r14. Bien sûr, il économise quelques cycles, mais encore une fois il n'est pas sage d'avoir plus de gestionnaires desservant un FIQ et oui FIQ a plus de priorité mais ce n'est pas une raison de dire qu'il gère l'interruption plus rapidement, les deux IRQ / FIQ fonctionnent à la même fréquence CPU, donc ils doivent fonctionner à même vitesse.
Cela peut être faux. Tout ce que je sais, C'est que FIQ signifie demande D'interruption rapide et que IRQ signifie demande D'interruption. A en juger par ces noms, je suppose qu'un FIQ sera manipulé (jeté?) plus rapide qu'un IRQ. Cela a probablement quelque chose à voir avec la conception du processeur où un FIQ interrompt le processus plus rapidement qu'un IRQ. Je m'excuse si je me trompe, mais je fais normalement de la programmation de niveau supérieur, je devine juste en ce moment.