it-swarm.com.de

Was ist der Unterschied zwischen dem FIQ- und dem IRQ-Interrupt-System?

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

67
Renjith G

Eine Funktion moderner ARM - CPUs (und einiger anderer).

Aus dem Patent:

Eine Methode zur Durchführung eines schnellen Interrupt in einem digitalen Datenprozessor mit der Fähigkeit mehr zu handhaben als ein Interrupt ist vorgesehen. Wenn ein Eine schnelle Interruptanforderung wird mit einem .__ empfangen. Das Flag wird gesetzt und der Programmzähler und Bedingungscode-Register sind auf einem Stapel gespeichert. Am Ende von Wartungsroutine die Rückkehr unterbrechen von Interrupt-Anweisungen erhält der Bedingungscode-Register welcher enthält den Status der digitalen Datenprozessor und überprüft, ob ob das Flag gesetzt wurde oder nicht . Wenn das Flag gesetzt ist, zeigt dies an, dass eine Schnell Interrupt wurde gewartet und daher ist nur der Programmzähler nicht gestapelt.

Mit anderen Worten, eine FIQ ist nur eine Interruptanforderung mit höherer Priorität, die durch Deaktivieren von IRQ und anderen FIQ-Handlern während der Anforderungsbearbeitung Priorität hat. Daher können während der Verarbeitung des aktiven FIQ-Interrupts keine weiteren Interrupts auftreten.

59
Chaos

ARM ruft FIQ den schnellen Interrupt auf, mit der Folge, dass IRQ normale Priorität ist. In jedem realen System gibt es viel mehr Quellen für Interrupts als nur zwei Geräte, und daher wird es einen externen Hardware-Interrupt-Controller geben, der das Maskieren, Priorisieren usw. dieser mehreren Quellen ermöglicht und die Interrupt-Anforderungsleitungen zum Prozessor führt.

Bis zu einem gewissen Grad macht dies den Unterschied zwischen den beiden Interrupt-Modi überflüssig, und viele Systeme verwenden nFIQ nicht oder verwenden sie analog zu dem nicht maskierbaren (NMI) Interrupt, der auf anderen Prozessoren gefunden wird (obwohl FIQ softwaremaskierbar ist auf den meisten ARM - Prozessoren).

Warum ruft ARM FIQ "schnell" auf?

  1. Der FIQ-Modus verfügt über eigene eigene Bankregister, r8-r14. R14 ist das Verbindungsregister, das die Rücksprungadresse (+4) von der FIQ enthält. Wenn Ihr FIQ-Handler jedoch so geschrieben werden kann, dass er nur r8-r13 verwendet, kann er diese Bankregister auf zwei Arten nutzen:
    • Einer ist, dass es nicht den Aufwand verursacht, alle Register, die von der Interrupt-Service-Routine (ISR) verwendet werden, zu pushen und zu poppen. Dies kann eine beträchtliche Anzahl von Zyklen sowohl bei der Eingabe als auch beim Verlassen der ISR einsparen.
    • Der Handler kann sich auch auf Werte verlassen, die von einem Aufruf zum nächsten in Registern verbleiben, so dass beispielsweise r8 als Zeiger auf ein Hardwaregerät verwendet werden kann und der Handler sich darauf verlassen kann, dass derselbe Wert das nächste Mal in r8 ist namens.
  2. FIQ-Position am Ende der Ausnahme-Vektortabelle (0x1C) bedeutet, dass, wenn der FIQ-Handlercode direkt am Ende der Vektortabelle platziert wird, keine Verzweigung erforderlich ist - der Code kann direkt von 0x1C ausgeführt werden. Dies erspart einige Zyklen beim Eintritt in die ISR.
  3. FIQ hat eine höhere Priorität als IRQ. Das bedeutet, wenn der Kern eine FIQ-Ausnahme auslöst, werden IRQs automatisch ausgeblendet. Ein IRQ kann den FIQ-Handler nicht unterbrechen. Das Gegenteil trifft nicht zu - der IRQ maskiert keine FIQs, und der FIQ-Handler (falls verwendet) kann den IRQ unterbrechen. Wenn sowohl IRQ- als auch FIQ-Anforderungen gleichzeitig auftreten, wird der Kern zuerst mit der FIQ umgehen.

Warum verwenden viele Systeme FIQ nicht?

  1. FIQ-Handler-Code kann normalerweise nicht in C geschrieben werden. Er muss direkt in der Assembly-Sprache geschrieben werden. Wenn Sie genügend Wert auf die ISR-Leistung legen, um FIQ verwenden zu können, möchten Sie wahrscheinlich nicht in jedem Fall einige Zyklen auf der Tabelle belassen, indem Sie in C codieren. Wichtig ist jedoch, dass der C-Compiler keinen Code erzeugt, der der Einschränkung folgt Verwendung nur der Register r8-r13. Code, der von einem C-Compiler erzeugt wird, der dem ARC-Aufrufstandard ATPCS entspricht, verwendet stattdessen die Register r0-r3 für Scratch-Werte und erzeugt am Ende der Funktion nicht den korrekten Wiederherstellungs-Rückgabecode cpsr.
  2. Die gesamte Interrupt-Controller-Hardware befindet sich normalerweise auf dem IRQ-Pin. Die Verwendung von FIQ ist nur dann sinnvoll, wenn Sie eine einzige Interruptquelle mit der höchsten Priorität an den nFIQ-Eingang angeschlossen haben und viele Systeme nicht über eine einzige Quelle mit dauerhafter Priorität verfügen. Es gibt keinen Wert, wenn mehrere Quellen mit dem FIQ verbunden werden und dann Software zwischen ihnen priorisiert wird, da dadurch fast alle Vorteile des FIQ gegenüber dem IRQ aufgehoben werden.
147
manav m-n

Chaos hat bereits gut geantwortet, aber ein weiterer Punkt, der bisher nicht behandelt wurde, ist, dass sich FIQ am Ende der Vektortabelle befindet. Daher ist es üblich, die Routine direkt dort zu starten, während der IRQ-Vektor normalerweise genau das ist. (dh ein Sprung nach irgendwo anders). Das Vermeiden dieses zusätzlichen Zweigs unmittelbar nach einem vollständigen Überlagern und Kontextwechsel ist ein leichter Geschwindigkeitsgewinn.

6
Pod

FIQ hat eine höhere Priorität und kann eingeführt werden, während ein anderer IRQ bearbeitet wird. Die kritischsten Ressourcen werden von FIQs verwaltet, der Rest von IRQs.

4
Sev

ein weiterer Grund ist der Fall, dass bei FIQ eine geringere Anzahl von Registern erforderlich ist, um den Stack zu verschieben. Der FIQ-Modus verfügt über Register für R8 bis R14_fiq

4
Ashok

Ich glaube, das ist, wonach Sie suchen:

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

Im Wesentlichen hat FIQ die höchste Priorität bei mehreren IRQ-Quellen mit niedrigerer Priorität.

1
AlbertoPL

FIQs haben eine höhere Priorität. Zweifellos sind die verbleibenden Punkte nicht sicher ..... FIQs unterstützen die Verarbeitung von Hochgeschwindigkeitsdatenübertragungen (oder -kanälen), wobei Hochgeschwindigkeits-Datenprozesse erforderlich sind. Wir verwenden FIQs .

1
Sriram

Keine Magie über FIQ. FIQ kann nur einen beliebigen anderen IRQ unterbrechen, der bedient wird. Das System reagiert schneller auf diese Interrupts, der Rest ist jedoch derselbe.

1
mishmashru

Es hängt davon ab, wie wir Interrupt-Handler entwerfen, da FIQ schließlich keine Verzweigungsanweisung benötigt. Außerdem verfügt es über einen eindeutigen Satz von r8-r14-Registern, so dass wir das nächste Mal, wenn wir zum FIQ-Interrupt zurückkehren, das Push/Pop-up nicht brauchen Stapel. Natürlich spart es einige Zyklen, aber es ist auch nicht ratsam, mehr Handler für einen FIQ zu verwenden, und ja, FIQ hat mehr Priorität, aber es gibt keinen Grund dafür, dass der Interrupt schneller gehandhabt wird. Beide IRQ/FIQ laufen mit derselben CPU-Frequenz. Sie müssen also mit der gleichen Geschwindigkeit laufen.

0