Qual è la differenza tra FIQ e IRQ interrupt di sistema?
-
13-09-2019 - |
Domanda
Voglio sapere la differenza tra FIQ e IRQ interrupt di sistema ogni microprocessore, e.g:ARM926EJ.
Soluzione
Una caratteristica delle moderne CPU ARM (e alcuni altri).
Dal brevetto:
Un metodo per l'esecuzione di un veloce interrompere in un elaboratore di dati digitali avente la capacità di gestire più che è previsto un interrupt. Quando un veloce richiesta di interruzione viene ricevuto un flag è impostato e il contatore di programma e registri di codice condizione sono memorizzati su una pila. Alla fine di interrompere la manutenzione di routine il ritorno dalle istruzioni di interrupt recupera registro codice condizione contiene lo stato del digitale Titolare del trattamento e verifica se il flag è stato impostato o meno. Se è impostato il flag che indica che un veloce interruzione è stato servito e quindi solo il contatore di programma è unstacked.
In altre parole, un FIQ è solo una richiesta di interruzione di priorità più alta, cioè ordine di priorità disattivando IRQ e altri gestori FIQ durante la richiesta di manutenzione. Pertanto, nessun altro interrupt possono verificarsi durante l'elaborazione del interrupt FIQ attivo.
Altri suggerimenti
BRACCIO chiamate FIQ
il fast interrupt, con l'implicazione che IRQ
è priorità normale.In qualsiasi sistema reale, ci saranno molte più fonti di interrupt di due dispositivi e non ci sarà quindi un po ' esterno hardware interrupt controller, che permette di mascheramento, priorità etc.di questi più fonti e che spinge la richiesta di interruzione di linee per il processore.
In una certa misura, questo rende la distinzione tra le due modalità di interrupt ridondante e molti sistemi non utilizzano nFIQ
a tutti, o utilizzare in modo analogo a come non-maskable (NMI
) interrupt su altri processori (anche se FIQ
è un software maskable su più processori ARM).
Allora, perché il BRACCIO di chiamata FIQ "veloce"?
- FIQ modalità dedicato sopraelevate registri,
r8-r14
.R14 è il link al registro che contiene l'indirizzo di ritorno(+4) dal FIQ.Ma se il FIQ gestore è in grado di essere scritto che si usa solor8-r13
, è possibile usufruire di queste sopraelevate registra in due modi:- Uno è che non è il sovraccarico di push e pop eventuali registri che vengono utilizzati per l'interrupt service routine (ISR).Questo può risparmiare un significativo numero di cicli sia di entrata e di uscita per l'ISR.
- Inoltre, il gestore può contare su valori di persistenti nei registri una chiamata e l'altra, in modo che, per esempio,
r8
può essere usato come un puntatore a un dispositivo hardware che il gestore può contare sullo stesso valore inr8
la prossima volta che viene chiamato.
- FIQ posizione alla fine del eccezione vector table (
0x1C
significa che se il FIQ gestore codice viene inserito direttamente alla fine della tabella vettoriale, filiale è richiesto il codice può eseguire direttamente da0x1C
.Questo consente di risparmiare un paio di cicli per l'ingresso ISR. - FIQ ha priorità maggiore rispetto IRQ.Questo significa che quando il nucleo assume un FIQ eccezione, è automaticamente le maschere di fuori degli Irq.Un IRQ non può interrompere il FIQ gestore.Non è vero il contrario - l'IRQ non maschera FIQs e così il FIQ gestore (se utilizzato), è possibile interrompere l'IRQ.Inoltre, se entrambi IRQ e FIQ richieste si verificano allo stesso tempo, il nucleo si occuperà con il FIQ prima.
Allora perché molti sistemi non utilizzare FIQ?
- FIQ gestore solitamente il codice può essere scritto in C - deve essere scritto direttamente in linguaggio assembly.Se si cura sufficientemente su ISR prestazioni di voler utilizzare FIQ, probabilmente non si vuole lasciare un paio di cicli di tabella di codifica in C, in ogni caso, ma soprattutto il compilatore C non produce codice che segue la restrizione sull'utilizzo di registri
r8-r13
.Codice prodotto da un compilatore C compatibile con ARMATPCS
chiamata di procedura standard saranno, invece, utilizzare i registrir0-r3
per scratch valori e la volontà di non produrre la correttacpsr
il ripristino codice di ritorno alla fine della funzione. - Tutti i controller di interrupt hardware è di solito l'IRQ pin.Utilizzando FIQ ha senso solo se si dispone di un solo interrupt con priorità più alta sorgente collegata al nFIQ di ingresso e di molti sistemi non hanno un unico permanentemente massima priorità di origine.Non vi è alcun valore di collegare più sorgenti per il FIQ, e, successivamente, il software di priorità tra di loro, come questo rimuove quasi tutti i vantaggi del FIQ ha più di IRQ.
FIQ o fast interrupt è spesso definito come Morbido DMA in BRACCIO, riferimenti.
Caratteristiche del FIQ sono,
- Modalità separata con sopraelevate registrare tra stack, link registrazione e R8-R12.
- Separato FIQ enable/disable bit.
- Coda di tabella del vettore (che è sempre la cache e mappati dalla MMU).
L'ultima caratteristica, inoltre, dà un leggero vantaggio rispetto a un IRQ che deve ramo.
Una velocità di demo in 'C'
Alcuni hanno citato la difficoltà di codice in assembler per gestire il FIQ. gcc
è annotazioni codice FIQ il gestore.Qui è un esempio,
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++;
}
}
Questo si traduce nelle seguenti quasi buona assemblatore,
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
Routine assembler a 0x1c
potrebbe sembrare,
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 vero e proprio UART probabilmente ha pronto un po', ma il codice per fare un ad alta velocità morbido DMA con il FIQ sarebbe solo 10-20 istruzioni.Il codice principale deve sondaggio il FIQ r10
per determinare se il buffer è finito.Principale (non di interrupt codice) può trasferire l'installazione e la sopraelevata FIQ registra utilizzando il msr
istruzioni per passare a FIQ modalità di trasferimento e non arginati R0-R7 per la sopraelevata R8-R13 registri.
In genere RTOS latenza di interrupt sarà 500-1000 istruzioni.Per Linux, forse 2000-10000 istruzioni.Reale DMA è sempre preferibile, tuttavia, per l'alta frequenza semplice interrupt (come un buffer di trasferimento), il FIQ in grado di fornire una soluzione.
Come FIQ è una questione di velocità, si dovrebbe considerare se non si è sicuri nel codice in assembler (o disposti a dedicare il tempo).Scritta in Assembler all'infinito in esecuzione programmatore sarà più veloce di un compilatore.Avendo GCC assist può aiutare un novizio.
La latenza
Come FIQ ha una maschera di bit è quasi ubiquitariamente abilitato.Sulla prima Cpu ARM (come il ARM926EJ), alcune operazioni atomiche doveva essere attuata dagli mascherare gli interrupt.Comunque anche con le più avanzate Corteccia Cpu, ci sono occasioni in cui un OS maschera di interrupt.Spesso il tempo di servizio non è fondamentale per un interrupt, ma il tempo tra la segnalazione e la manutenzione.Qui, il FIQ ha anche un vantaggio.
Debolezza
Il FIQ non è scalabile.Per poter utilizzare più FIQ
fonti, sopraelevata di registri devono essere condivisi tra routine di interrupt.Inoltre, il codice deve essere aggiunto per determinare cosa ha causato l'interrupt/FIQ.Il FIQ è generalmente una one trick pony.
Se l'interrupt è molto complessa (driver di rete, USB, ecc), quindi il FIQ probabilmente ha poco senso.Questa è fondamentalmente la stessa dichiarazione come multiplexing gli interrupt.Il sopraelevate registri dare 6 variabili per l'uso che non caricare dalla memoria.Registrarsi è più veloce della memoria.I registri sono più veloce di L2-cache.I registri sono più veloci rispetto a L1-cache.I registri sono veloci.Se non è possibile scrivere una routine che viene eseguita con 6 variabili, quindi il FIQ non è adatto.Nota:È possibile fare doppio dovere alcuni registrare con turni e ruota che sono liberi sul BRACCIO, se si utilizza 16 bit.
Ovviamente il FIQ è più complesso.OS sviluppatori per supportare più sorgenti di interrupt.Requisiti dei clienti per un FIQ varia e spesso si rendono conto che dovrebbe lasciare che il cliente rotolo di loro.Di solito il supporto per un FIQ è limitata, come qualsiasi supporto è probabile che toglie il vantaggio principale, VELOCITÀ.
Riepilogo
Non bash mio amico FIQ.Si tratta di un sistema di programmatori un trucco contro stupido hardware.Non è per tutti, ma ha il suo posto.Quando tutti gli altri tentativi di ridurre la latenza e aumentare ISR frequenza del servizio non è riuscita, la FIQ può essere la vostra unica scelta (o un hardware migliore della squadra).
È anche possibile utilizzare come panico interrupt in qualche sicurezza in applicazioni critiche.
Il caos ha già risposto bene, ma un ulteriore punto non coperta finora è che FIQ è alla fine del tavolo vettoriale e quindi è comune / tradizionale per avviare solo la routine proprio lì, mentre il vettore IRQ di solito è proprio questo . (Vale a dire un salto da qualche altra parte). Evitando quel ramo in più subito dopo un passaggio completo scorta e il contesto è un leggero aumento di velocità.
FIQ è la priorità più alta, e può essere introdotto mentre un altro IRQ viene gestita. La risorsa più critica (s) sono gestite da FIQ di, il resto sono gestite da IRQ.
Un'altra ragione è nel caso di FIQ, è necessaria minore numero di registro per spingere nella pila, la modalità FIQ ha R8 per R14_fiq registri
Credo che questo è quello che stai cercando:
http: //newsgroups.derkeiler .com / Archivio / Comp / comp.sys.arm / 2005-09 / msg00084.html
Essenzialmente, FIQ sarà la più alta priorità con più fonti IRQ priorità inferiore.
Nessun qualsiasi magico FIQ. FIQ appena può interrompere qualunque altro IRQ che viene servito, è per questo che si chiama 'veloce'. Il sistema reagisce velocemente su questi interrupt ma il resto è la stessa.
FIQs sono priorità più alta, senza dubbio, punti rimanenti non sono sicuro ..... FIQs sosterranno trasferimento ad alta velocità dei dati (o) elaborazione del canale, in cui i processi dati ad alta velocità è necessaria usiamo FIQs e generalmente abituati IRQ normale interrupt Handlling.
Dipende da come progettiamo gestori di interrupt, come FIQ è finalmente esso non può avere bisogno un'istruzione di salto, inoltre ha set unico di r8-R14 registra così la prossima volta che torniamo a FIQ interrupt non abbiamo bisogno di spingere / pop-up dello stack. Naturalmente fa risparmiare alcuni cicli, ma ancora una volta non è saggio avere più gestori che servono una FIQ e sì FIQ sta avendo più la priorità, ma non è alcun motivo per dire che gestisce l'interrupt più veloce, sia IRQ / FIQ funzionare a stessa frequenza della CPU, Quindi devono essere in esecuzione alla stessa velocità.
Questo può essere sbagliato. Tutto quello che so è che sta per FIQ veloce di interrupt e che IRQ sta per Interrupt Request. A giudicare da questi nomi, io immagino che una FIQ sarà gestito (gettato?) Più veloce di un IRQ. Probabilmente ha qualcosa a che fare con il design del processore dove un FIQ interromperà il processo più veloce di un IRQ. Mi scuso se ho sbagliato, ma faccio di solito la programmazione di più alto livello, sto solo cercando di indovinare al momento.