Question

Je veux savoir la différence entre la FIQ et d'interruption IRQ système tout le microprocesseur, les e.g:ARM926EJ.

Était-ce utile?

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"?

  1. 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 uniquement r8-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 dans r8 la prochaine fois, il est appelé.
  2. 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 0x1C.Cela permet d'économiser un peu sur les cycles de l'entrée de l'ISR.
  3. 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?

  1. 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 de ATPCS appel de procédure standard va plutôt utiliser les registres r0-r3 pour les valeurs de zéro et ne produira pas le bon cpsr la restauration de code de retour à la fin de la fonction.
  2. 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,

  1. mode séparé avec registre accumulées y compris la pile, le registre de liaison et R8-R12.
  2. séparé FiQ activer / désactiver le bit.
  3. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top