Je souhaite connaître la différence entre un système d’interruption FIQ et IRQ dans n’importe quel microprocesseur, par exemple: ARM926EJ.
Réponses
Trop de publicités?BRAS appels FIQ
le rapide interruption, avec l'implication que IRQ
est une 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
, ou l'utiliser d'une manière analogue à la non-maskable (NMI
) interruption trouvé sur d'autres processeurs (bien qu' FIQ
est un logiciel maskable sur la plupart des processeurs ARM).
- 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 enr8
la prochaine fois qu'elle est appelée.
- 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 à partir d'0x1C
. 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.
- 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 le BRAS de l'ATPCS
de l'appel de procédure standard va plutôt utiliser les registresr0-r3
pour les valeurs de zéro et ne produira pas de corrigercpsr
de 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 désigné comme Soft DMA dans certains BRAS de références.
Caractéristiques de la FIQ sont,
- Mode séparé avec encaissé s'inscrire, y compris la pile, lien s'inscrire et R8-R12.
- Séparer FIQ enable/disable bit.
- La queue de vecteur de la table (qui est toujours dans le cache et cartographiés par MMU).
La dernière fonctionnalité donne aussi un léger avantage sur un IRQ qui doivent branche.
Une vitesse de démonstration en "C"
Certains ont cité la difficulté de coder en assembleur pour gérer la FIQ. gcc
a des annotations de code pour une FIQ gestionnaire. 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 la suite 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
L'assembleur de routine à l' 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 prêt peu, mais le code pour faire une grande vitesse douce DMA avec la FIQ ne serait que de 10 à 20 instructions. Le code principal doit interroger la FIQ r10
afin de déterminer si le tampon est terminé. Principale (sans interruption code) de transférer et d'installation de la mise en banque FIQ registres à l'aide de la msr
instructions pour passer à FIQ mode et de transfert non bancarisés R0-R7 est incliné R8-R13 registres.
Généralement RTOS latence d'interruption sera de 500 à 1000 instructions. Pour Linux, il peut-être 2000-10000 instructions. Réel DMA est toujours préférable, cependant, pour les hautes fréquences simples interruptions (comme un tampon de transfert), la FIQ peut apporter une solution.
La FIQ est une question de vitesse, vous ne devriez pas envisager si vous n'êtes pas sûr de codage en assembleur (ou disposé à consacrer du temps). Assembleur écrit par une infinité de course programmeur sera plus rapide qu'un compilateur. Avoir GCC aider peut aider un novice.
La latence
La FIQ a un autre masque de bits, il est presque ubiquitaire activé. Sur les anciens Processeurs ARM (comme le ARM926EJ), certaines opérations atomiques ont dû être mises en œuvre par le masquage des interruptions. Néanmoins, même avec les plus avancés Cortex Processeurs, il ya des occasions où un OS qui masque les interruptions. Souvent le temps de service n'est pas critique pour une interruption, mais le temps entre la signalisation et l'entretien. Ici, la FIQ a aussi un avantage.
Faiblesse
La FIQ n'est pas évolutif. Afin d'utiliser plusieurs FIQ
sources, la mise en banque de registres doit être partagée entre les routines d'interruption. Aussi, le code doit être ajouté afin de déterminer ce qui a causé l'interruption/FIQ. La FIQ est généralement un poney d'un tour.
Si votre interruption est très complexe (pilote de réseau, USB, etc), puis la FIQ fait probablement que peu de sens. C'est fondamentalement la même déclaration de multiplexage, les interruptions. La mise en banque des registres de donner 6 gratuit les variables à utiliser qui ne chargez jamais de la mémoire. Registre sont plus rapides que la mémoire. Les registres sont plus rapides que le cache L2. Les registres sont plus rapides que les L1-cache. Les registres sont rapides. Si vous ne pouvez pas écrire une routine qui fonctionne avec 6 variables, alors la FIQ n'est pas adapté. Remarque: Vous pouvez double duty certains s'inscrire auprès déplace et tourne qui sont gratuits sur le BRAS, si vous utilisez des valeurs 16 bit.
Évidemment, la FIQ est plus complexe. OS les développeurs veulent en charge plusieurs sources d'interruption. Les exigences des clients pour une FIQ varient et souvent, ils se rendent compte qu'ils doivent simplement permettre au client de rouler leur propre. Généralement en charge pour un FIQ est limitée que tout support est susceptible de détourner l'attention de l'avantage principal, de la VITESSE.
Résumé
Ne pas bash mon ami de la FIQ. C'est un système de programmeurs un truc contre stupide matériel. Ce n'est pas pour tout le monde, mais il a sa place. Lorsque toutes les autres tentatives de réduire la latence et augmenter ISR de la fréquence du service a échoué, la FIQ peut être votre seul choix (ou une meilleure gestion du matériel de l'équipe).
Il est aussi possible de l'utiliser comme une panique interruption dans certains les applications de sécurité critiques.
Une fonctionnalité moderne de Processeurs ARM (et quelques autres).
À partir de la demande de brevet:
Une méthode est de faire un rapide interruption dans un processeur de données numériques ayant la capacité de traitement de plus de d'interruption est fourni. Lorsqu'un rapide de la demande d'interruption est reçu le drapeau est réglé, et le compteur de programme et de l'état code registres sont stockées sur une pile. À la fin de la interrompre l'entretien de routine, le retour à partir d'interruption instructions récupère le code condition registre contient l'état du numérique processeur de données et vérifie si l'indicateur a été défini ou pas. Si le drapeau est réglé, il indique qu'un rapide interruption de service et par conséquent, seul le compteur de programme est non empilés.
En d'autres termes, un FIQ est juste une priorité plus grande de demande d'interruption, qui est priorisée par la désactivation de l'IRQ et autres FIQ les gestionnaires lors de la demande de l'entretien. Par conséquent, aucune autre interruptions peuvent se produire lors du traitement de l'actif FIQ interrompre.
Le chaos a déjà bien répondu, mais un point supplémentaire non couvert jusqu'à présent 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.