Quelle est la différence entre la FIQ et d'interruption IRQ système?
-
13-09-2019 - |
Question
Je veux savoir la différence entre la FIQ et d'interruption IRQ système tout le microprocesseur, les e.g:ARM926EJ.
La solution
Une caractéristique de processeurs ARM modernes (et quelques autres).
A partir du brevet:
Procédé de réalisation d'un jeûne interrompre dans un processeur de données numériques ayant la capacité de traiter plus d'une interruption est fournie. Lorsqu'un demande d'interruption rapide est reçue Le drapeau est réglé et le compteur de programme et les registres de code de condition sont stockés sur une pile. À la fin de interrompre l'entretien de routine le retour à partir d'instructions d'interruption récupère le registre de code de condition qui contient l'état de la numérique Processeur de données et vérifie si le drapeau a été fixé ou non. Si le drapeau est défini, il indique qu'un interruption rapide a été réparé et donc que le compteur de programme est dépilé.
En d'autres termes, un FIQ est juste une demande d'interruption de priorité plus élevée, qui est prioritaire en désactivant IRQ et d'autres gestionnaires de la FIQ lors de l'entretien de la demande. Par conséquent, aucune autre interruption peut se produire pendant le traitement de l'interruption de la FIQ active.
Autres conseils
BRAS appels FIQ
l' 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 appareils et il sera donc un peu de matériel externe de contrôleur d'interruption qui permet de masquage, la hiérarchisation des priorités, etc.de ces multiples sources qui pousse les lignes de requête d'interruption du processeur.
Dans une certaine mesure, ce qui rend la distinction entre les deux modes d'interruption redondants et de nombreux systèmes n'utilisent pas de nFIQ
à tous, ou l'utiliser d'une manière analogue à la non-maskable (NMI
) interrompre trouvé sur d'autres processeurs (bien que FIQ
le logiciel est-maskable sur la plupart des processeurs ARM).
Alors, pourquoi ne BRAS appel FIQ "rapide"?
- FIQ mode a son propre incliné registres,
r8-r14
.R14 est le lien de registre qui contient l'adresse de retour(+4) à partir de la FIQ.Mais si votre FIQ gestionnaire est en mesure d'être écrite telle qu'elle utilise uniquementr8-r13
, il peut profiter de ces mises en banque registres de deux façons:- L'une est de ne pas payer les frais généraux de pousser et éclater de tous les registres qui sont utilisés par la routine de service d'interruption (ISR).Cela peut enregistrer un nombre important de cycles à la fois 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 peuvent compter sur la même valeur dansr8
la prochaine fois, il est appelé.
- FIQ lieu à la fin de l'exception vecteur de table (
0x1C
) signifie que si la FIQ gestionnaire de code est placé directement à la fin du vecteur de table, pas de branche est nécessaire - le code peut s'exécuter directement à partir0x1C
.Cela permet d'économiser un peu sur les cycles de l'entrée de l'ISR. - FIQ a priorité plus élevée que les IRQ.Cela signifie que, lorsque l'âme prend un FIQ exception, elle est automatiquement masque Irq.Une IRQ ne peut pas interrompre la FIQ gestionnaire.L'inverse n'est pas vrai - l'IRQ ne masque pas FIQs et donc la FIQ gestionnaire (si utilisé) peut interrompre l'IRQ.En outre, si les deux IRQ et de la FIQ demande se produire dans le même temps, le noyau va traiter de la FIQ en premier.
Alors pourquoi de nombreux systèmes utilisent pas FIQ?
- FIQ code du gestionnaire ne peut généralement pas être écrit en C, il doit être rédigé directement en langage d'assemblage.Si vous vous souciez suffisamment ISR sur la performance de vouloir les utiliser FIQ, vous n'auriez probablement pas envie de laisser un peu de cycles sur la table par le codage 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
.Code produit par un compilateur C compatible avec BRAS deATPCS
appel de procédure standard va plutôt utiliser les registresr0-r3
pour les valeurs de zéro et ne produira pas le boncpsr
la restauration de code de retour à la fin de la fonction. - Tous le contrôleur d'interruption matérielle est généralement sur l'IRQ pin.À l'aide FIQ n'a de sens que si vous avez une seule priorité la plus élevée interrompre la source connectée à l'nFIQ d'entrée et de nombreux systèmes n'ont pas une seule manière permanente la plus haute priorité à la source.Il n'existe pas de valeur de la connexion de plusieurs sources à la FIQ, et puis d'avoir un logiciel de hiérarchiser entre eux, comme cela supprime presque tous les avantages de la FIQ a plus d'IRQ.
FIQ ou rapide interruption est souvent appelé Soft DMA dans quelques références ARM.
Caractéristiques du FIQ sont,
- mode séparé avec registre accumulées y compris la pile, le registre de liaison et R8-R12.
- séparé FiQ activer / désactiver le bit.
- Queue de table vecteur (qui est toujours dans le cache et cartographiés par MMU).
La dernière caractéristique donne également un léger avantage sur une IRQ qui doit se ramifier.
Une démonstration de vitesse dans 'C'
Certains ont cité la difficulté de codage en assembleur pour gérer la FIQ. gcc
a des annotations à 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 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.
A vrai UART a sans doute un peu prêt, mais le code pour faire une grande vitesse avec la FIQ seront seulement 10-20 instructions. Le code principal doit interroger le r10
pour déterminer FIQ lorsque la mémoire tampon est terminée. Main (code non-interruption) peut transférer et installer le misé FIQ registres à l'aide de l'instruction de msr
pour basculer sur FIQ mode et le transfert R0-R7 non encaissé au encaissé enregistre R8-R13.
En règle générale RTOS latence d'interruption sera 500-1000 instructions. Pour Linux, il peut-être 2000-10000 instructions. DMA réel est toujours préférable, cependant, pour les interruptions simples à haute fréquence (comme un transfert de mémoire tampon), FIQ peut fournir une solution.
FIQ est sur la vitesse, vous ne devez pas considérer si vous n'êtes pas en sécurité dans le codage en assembleur (ou prêt à consacrer le temps). Assembleur écrit par un programmeur infiniment fonctionnement sera plus rapide qu'un compilateur. Avoir GCC aide peut aider un novice.
Latence
FIQ a un peu de masque séparé, il est presque ubiquitaire activée. Sur les CPU ARM antérieures (comme le ARM926EJ), certaines opérations atomiques devaient être mises en œuvre par des interruptions de masquage. Toujours même avec les processeurs Cortex les plus avancés, il y a des occasions où un OS interruptions masque. 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 également un avantage.
Faiblesse
FIQ n'est pas évolutive. Pour utiliser plusieurs sources de FIQ
, les registres mis en réserve doivent être partagés entre les routines d'interruption. En outre, il faut ajouter le code pour déterminer ce qui a causé l'interruption / FIQ. FIQ est généralement un poney truc .
Si votre interruption est très complexe (pilote réseau, USB, etc.), la FIQ est probablement peu de sens. Ceci est essentiellement la même déclaration que le multiplexage des interruptions. banked registres donnent 6 variables libres d'utiliser qui jamais charger 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 fonctionne avec 6 variables, le FIQ ne convient pas. Remarque: Vous pouvez double devoir registre avec un certain décalages et tourne qui sont libres sur le bras, si vous utilisez des valeurs 16 bits
.Il est évident que le FIQ est plus complexe. Les développeurs OS veulent prendre en charge plusieurs sources d'interruption. Les exigences des clients pour un FIQ varient et souvent ils se rendent compte qu'ils devraient juste laisser le client rouler leur propre . Habituellement, pour soutenir un FIQ est limitée comme tout support est susceptible de porter atteinte à l'avantage principal, SPEED .
Résumé
Ne pas bash mon ami le FIQ . Il est un programme de systèmeers un tour contre le matériel stupide. Il 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 de service ISR a échoué, le FIQ peut être votre seul choix (ou une meilleure équipe matérielle).
Il est également possible d'utiliser comme panique interrompre dans certaines applications critiques de sécurité.
Chaos a déjà répondu à bien, mais un point supplémentaire non jusqu'à présent est que la FIQ est à la fin de la table vectorielle et il est si commun / traditionnel juste commencer la routine là, alors que le vecteur IRQ est généralement juste que . (Soit un saut à un autre endroit). Éviter cette branche supplémentaire immédiatement après une planque pleine et changer de contexte est un léger gain de vitesse.
est FiQ une priorité plus élevée, et peut être introduit tandis qu'un autre IRQ est en cours de traitement. La ressource la plus critique (s) sont pris en charge par la FIQ de, le reste est pris en charge par IRQ.
Une autre raison est, en cas de FIQ, moindre nombre de registres est nécessaire pour pousser la pile, le mode FIQ a R8 aux registres R14_fiq
Je crois que c'est ce que vous cherchez:
http: //newsgroups.derkeiler .com / Archive / Comp / comp.sys.arm / 2005-09 / msg00084.html
Pour l'essentiel, la FIQ sera de la plus haute priorité multiple, la baisse des sources IRQ prioritaires.
Pas de magie à propos de la FIQ. FIQ ne peut tout simplement interrompre toute autre IRQ qui est servi, ce pourquoi il est appelé « rapide ». Le système réagit plus rapidement sur ces interruptions, mais le reste est le même.
FIQs sont une priorité plus élevée, sans aucun doute, les points restants je ne suis pas sûr ..... FIQs soutiendront le traitement du canal de transfert de données à haute vitesse (ou), où les processus de données à grande vitesse est nécessaire que nous utilisons FIQs et généralement IRQ utilisé d'interruption normale à une manutention.
Il dépend la façon dont nous concevons des gestionnaires d'interruption, comme la FIQ est enfin il ne peut pas besoin d'une instruction de branchement, aussi a ensemble unique de r8-r14 enregistre donc la prochaine fois que nous revenons à FiQ d'interruption, nous ne avons pas besoin de pousser / pop la pile. Ofcourse enregistre des cycles, mais encore une fois il est sage d'avoir plus de gestionnaires au service d'une FIQ et oui FIQ est d'avoir une plus grande priorité, mais il n'y a aucune raison de dire qu'il gère l'interruption plus rapide, à la fois IRQ / FIQ fonctionne à même fréquence CPU, ils doivent donc être en cours d'exécution à la même vitesse.
Cela peut se tromper. Tout ce que je sais est que la FIQ signifie demande rapide et d'interruption IRQ signifie demande d'interruption. A en juger par ces noms, je suppose que la FIQ sera traitée (jeté?) Plus vite qu'une IRQ. Il a probablement quelque chose à voir avec la conception du processeur où une FIQ interrompt le processus plus rapide qu'une IRQ. Excusez-moi si je me trompe, mais je fais normalement la programmation de niveau supérieur, je devine juste en ce moment.