Je souhaite connaître la différence entre les systèmes d’interruption FIQ et IRQ dans Tout microprocesseur, par exemple: ARM926EJ.
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.
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"?
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: 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é.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.Alors, pourquoi de nombreux systèmes n'utilisent-ils pas la FIQ?
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.FIQ ou interruption rapide est souvent appelé Soft DMA dans certaines références ARM.
Les caractéristiques du FIQ sont,
La dernière fonctionnalité donne également un léger avantage par rapport à un IRQ qui doit créer une branche.
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.
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.
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.
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é.
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.
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.
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
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.
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. .
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.
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.