Frage

Ich möchte den Unterschied zwischen FIQ und IRQ Interrupt -System in jedem Mikroprozessor, z. B.:ARM926EJ.

War es hilfreich?

Lösung

Ein Merkmal der modernen ARM-CPUs (und einige andere).

Aus dem Patent:

  

Ein Verfahren eine schnelle Durchführung von   in einem Digitaldatenprozessor zu unterbrechen   mit der Fähigkeit, mehr Handling   als ein Interrupt wird zur Verfügung gestellt. Wenn ein   schnelle Interrupt-Anforderung empfangen wird ein   Flag gesetzt und der Programmzähler   und Bedingungscoderegister sind   auf einem Stapel abgelegt. Am Ende von   Serviceroutine die Rückkehr unterbrechen   von Interrupt-Befehle abruft   das Bedingungscode-Register, das   enthält den Status des digitalen   Datenprozessor und überprüft,   ob das Flag gesetzt worden ist oder nicht.   Wenn das Flag gesetzt ist es zeigt an, dass ein   schnelle Unterbrechung wurde gewartet und   also nur der Programmzähler   unstacked.

Mit anderen Worten, ein FIQ ist nur eine höhere Priorität Interrupt-Anforderung, dass priorisiert wird durch IRQ und andere FIQ-Handler während Anfrage Service zu deaktivieren. Daher können keine weiteren Unterbrechungen während der Verarbeitung des aktiven FIQ-Interrupt auftreten.

Andere Tipps

ARM Anrufe FIQ die schnellen Interrupt , mit der Implikation, dass IRQ ist normale Priorität . In jedem realen System wird es viele weitere Quellen von Interrupts als nur zwei Geräte, und es wird daher einige externe Hardware-Interrupt-Controller sein, die Maskierung ermöglicht, Priorisierung etc. dieser verschiedenen Quellen und die treibt die Interruptanforderungsleitungen an den Prozessor.

Bis zu einem gewissen Grad, macht dies die Unterscheidung zwischen den beiden Interrupt-Modi überflüssig und viele Systeme nFIQ gar nicht, oder verwenden Sie es in einer Weise analog zu der nicht-maskierbare (NMI) Interrupt auf anderen Prozessoren gefunden (obwohl FIQ ist eine Software maskable auf den meisten ARM-Prozessoren).

  

Warum also ARM Anruf FIQ "schnell"?

  1. FIQ-Modus verfügt über eine eigene überhöhte Register, r8-r14. R14 ist das Link-Register, das die Rücksprungadresse (+4) vom FIQ hält. Aber wenn Ihr FIQ-Handler der Lage ist, so geschrieben werden, dass es nur r8-r13 verwendet, kann es die Vorteile dieser überhöhten Register auf zwei Arten erfolgen:
    • Eine davon ist, dass es nicht den Aufwand für Schub- und knallen alle Register nicht entstehen, die durch die Interrupt-Service-Routine (ISR) verwendet werden. Dies kann eine erhebliche Anzahl von Zyklen sowohl Ein- und Ausgang zum ISR speichern.
    • Auch kann der Handler verläßt sich auf Werte in den Registern von einem Aufruf zum nächsten persistierenden, so dass zum Beispiel r8 als Zeiger auf ein Hardware-Gerät verwendet werden kann, und die Prozedur kann auf dem gleichen Wert setzt in r8 wobei den nächsten Mal aufgerufen wird.
  2. FIQ Lage am Ende des Ausnahmevektortabelle (0x1C) bedeutet, dass, wenn der FIQ Handler-Code direkt am Ende des Vektors Tisch gelegt wird, wird kein Zweig erforderlich - der Code direkt von 0x1C ausführen kann. Das spart ein paar Zyklen beim Eintritt in den ISR.
  3. hat FIQ höhere Priorität als IRQ. Dies bedeutet, dass, wenn der Kern eine FIQ Ausnahme nimmt, es maskiert IRQs automatisch. Ein IRQ kann die FIQ-Handler nicht unterbrechen. Das Gegenteil ist nicht wahr - der IRQ nicht FIQs maskieren und so die FIQ-Handler (falls verwendet) können die IRQ-Interrupt. Außerdem, wenn beide IRQ und FIQ-Anfragen zur gleichen Zeit auftreten, wird der Kern mit dem FIQ beschäftigt zuerst.
  

Also, warum viele Systeme nicht FIQ verwenden?

  1. FIQ-Handler-Code kann in der Regel nicht in C geschrieben werden - es muss geschrieben in Assembler-Sprache direkt werden. Wenn Sie ausreichend über ISR Leistung zu wollen, egal FIQ verwenden, würden Sie wahrscheinlich nicht ein paar Zyklen auf den Tisch verlassen wollen, indem sie in jedem Fall in C-Codierung, aber noch wichtiger ist der C-Compiler keinen Code erzeugen, der die Einschränkung folgt auf Verwendung registriert nur r8-r13. Code durch einen C-Compiler erzeugt kompatibel mit ATPCS Procedure Call Standard ARM wird stattdessen Register verwenden r0-r3 für Scratch-Werte und die korrekte cpsr Wiederherstellung Return-Code am Ende der Funktion nicht erzeugen.
  2. Alle von der Interrupt-Controller-Hardware ist in der Regel auf dem IRQ-Pin. Mit FIQ macht nur Sinn, wenn Sie eine einzelne Unterbrechung höchster Priorität Quelle an den nFIQ Eingang und viele Systeme haben keine einzige permanent höchste Priorität Quelle angeschlossen haben. Es gibt keinen Wert mehrere Quellen an den FIQ verbindet und dann mit Software zwischen ihnen priorisieren, da dies alle beseitigt fast die Vorteile der FIQ über IRQ hat.

FIQ oder schnelle Interrupt wird oft als Soft DMA in einigen ARM Referenzen.
Funktionen der FIQ sind,

  1. Separate Modus mit überhöhten Register einschließlich Stapel, Verbindungsregister und R8-R12.
  2. Separate FIQ aktivieren / deaktivieren Bit.
  3. Schwanz Vektortabelle (die immer im Cache und kartiert durch MMU).

Das letzte Feature gibt auch einen leichten Vorteil gegenüber einem IRQ , die verzweigen müssen.

Eine Geschwindigkeit Demo in 'C'

Einige haben die Schwierigkeit der Codierung in Assembler zitierte den FIQ zu handhaben. gcc hat Annotationen einen FIQ Handler codieren. Hier ein Beispiel:

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++;
    }
}

Dies führt zu dem folgenden fast gut Assembler,

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

Die Assembler Routine bei 0x1c aussehen könnte,

   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.

Eine echte UART hat wahrscheinlich ein Bereit-Bit, aber der Code eine hohe Geschwindigkeit Soft DMA mit dem FIQ würde nur 10-20 Anweisungen zu machen. Der Haupt Code muss den FIQ r10 abzufragen, um zu bestimmen, wenn der Puffer beendet ist. Main (Nicht-Interrupt-Code) können übertragen und richten Sie die überhöht FIQ Register durch die msr Anweisung mit auf FIQ -Modus wechseln und übertragen nicht überhöht R0-R7 mit dem überhöhten R8-R13 registriert.

Normalerweise Interrupt-Latenzzeit RTOS wird 500-1000 Anweisungen sein. Für Linux, es vielleicht 2000-10000 Anweisungen. Real DMA ist immer besser, aber für hohe Frequenz einfache Unterbrechungen (wie ein Puffer-Transfer), die FIQ kann eine Lösung bieten.

Wie die FIQ über die Geschwindigkeit ist, sollten Sie es nicht beachten, wenn Sie nicht bei der Codierung in Assembler sind sichern (oder bereit, die Zeit zu widmen). Assembler geschrieben von einem unendlich laufenden Programmierer wird schneller sein als ein Compiler. Mit GCC helfen kann einen Anfänger helfen.

Latency

Wie die FIQ hat eine separate Maske Bit ist es fast ubiquitär aktiviert. Bei älteren ARM-CPUs (wie die ARM926EJ) hatten einige atomare Operationen durch Maskieren von Interrupts implementiert werden. Noch einmal mit dem fortschrittlichsten Cortex CPUs gibt es Gelegenheiten, wo ein OS-Interrupts maskiert. Oft ist die Service-Zeit für einen Interrupt nicht kritisch, aber die Zeit zwischen Melde- und Wartung. Hier ist die FIQ hat auch einen Vorteil.

Schwäche

Die FIQ ist nicht skalierbar. Um mehr FIQ Quellen zu verwenden, die überhöhten Register müssen unter Interrupt-Routinen gemeinsam genutzt werden. Auch Code muss hinzugefügt werden, um festzustellen, was die Unterbrechung / FIQ verursacht. Die FIQ ist im Allgemeinen ein One Trick Pony .

Wenn Ihr Interrupt sehr komplex ist (Netzwerktreiber, USB, etc.), dann macht das FIQ wahrscheinlich wenig Sinn. Dies ist im Grunde die gleiche Aussage wie Multiplexen des Interrupts. Die überhöhten Register geben 6 freie Variablen, die verwenden, nie aus dem Speicher laden . Register sind schneller als Speicher. Die Register sind schneller als L2-Cache. Die Register sind schneller als L1-Cache. Die Register sind schnell. Wenn Sie nicht eine Routine schreiben, die mit 6 Variablen ausgeführt wird, dann wird die FIQ ist nicht geeignet. Hinweis: Sie können Pflicht einige Register mit Verschiebungen verdoppeln und dreht , die auf der ARM-frei sind, wenn Sie 16-Bit-Werte verwenden

.

Offensichtlich ist die FIQ ist komplexer. OS-Entwickler wollen mehrere Interrupt-Quellen unterstützen. Die Anforderungen der Kunden für eine FIQ variieren und oft erkennen, dass sie sie sollten nur der Kunde lassen ihre eigene Rolle . In der Regel Unterstützung für eine FIQ ist jede Unterstützung beschränkt ist wahrscheinlich von der Hauptvorteil schmälern, SPEED .

Zusammenfassung

Sie bash nicht mein Freund, der FIQ . Es ist ein Systemprogrammers einen Trick gegen dumme Hardware. Es ist nicht jedermanns Sache, aber es hat seinen Platz. Wenn alle anderen Versuche, die Latenz zu verringern und ISR Dienstfrequenz ausgefallen ist, die FIQ erhöhen kann Ihre einzige Wahl (oder ein besseres Hardware-Team) sein.

Es ist möglich, auch als Panik verwenden Unterbrechung in einigen sicherheitskritischen Anwendungen.

Chaos hat bereits gut beantwortet, aber ein zusätzlicher Punkt nicht so weit abgedeckt ist, dass FIQ am Ende der Vektortabelle ist, und es ist so üblich / traditionell nur genau dort die Routine zu starten, während der IRQ-Vektor in die Regel nur, dass . (Dh ein Sprung zu woanders). Vermeiden, dass zusätzlichen Zweig unmittelbar nach einem vollständigen Stash und Kontextwechsel ist ein leichter Geschwindigkeitsgewinn.

FIQ ist eine höhere Priorität und kann eingeführt werden, während ein anderer IRQ behandelt wird. Die kritischste Ressource (n) von FIQ die behandelt werden, der Rest von IRQ behandelt.

ein weiterer Grund, bei FIQ ist, geringere Anzahl von Registern benötigt wird, in dem Stapel zu schieben, FIQ Modus hat R8 R14_fiq Register

Ich glaube, das ist das, was Sie suchen:

http: //newsgroups.derkeiler .com / Archiv / Comp / comp.sys.arm / 2005-09 / msg00084.html

Im Wesentlichen FIQ wird mit mehreren, eine niedrigere Priorität IRQ Quellen von höchster Priorität sein.

Keine irgendeine Magie über FIQ. FIQ kann nur andere IRQ-Interrupt, das serviert wird, das ist, warum es ‚schnell‘ bezeichnet wird. Das System reagiert schneller auf diesen Unterbrechungen, aber der Rest ist das gleiche.

FIQs sind höhere Priorität ohne Zweifel verbleibenden Punkte Ich bin nicht sicher ..... FIQs wird High-Speed-Datenübertragung (oder) Kanalverarbeitung unterstützen, wo Hochgeschwindigkeitsdatenprozesse erforderlich ist, wir FIQs verwenden und im Allgemeinen IRQs verwendet werden normale Interrupt-Handlling.

Es hängt davon ab, wie wir Interrupt-Handler entwerfen, da FIQ letztendlich möglicherweise keinen Verzweigungsbefehl benötigt. Außerdem verfügt es über einen einzigartigen Satz von R8-R14-Registern, sodass wir das nächste Mal, wenn wir zum FIQ-Interrupt zurückkehren, diesen nicht per Push/Popup aufrufen müssen Stapel.Natürlich spart es einige Zyklen, aber auch hier ist es nicht ratsam, mehr Handler zu haben, die einen FIQ bedienen, und ja, FIQ hat eine höhere Priorität, aber es gibt keinen Grund zu sagen, dass es den Interrupt schneller verarbeitet, da beide IRQ/FIQ mit der gleichen CPU-Frequenz laufen. Sie müssen also mit der gleichen Geschwindigkeit laufen.

Dies kann falsch sein. Ich weiß nur, dass FIQ für Fast Interrupt Request steht und dass IRQ steht für Interrupt Request. Geht man von diesen Namen, ich denke, dass ein FIQ gehandhabt wird (geworfen?) Schneller als ein IRQ. Es hat wahrscheinlich etwas mit dem Design des Prozessors zu tun, wo ein FIQ wird den Prozess schneller als ein IRQ-Interrupt. Ich entschuldige mich, wenn ich falsch bin, aber ich normalerweise höhere Level-Programmierung, ich bin in diesem Augenblick nur raten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top