Domanda

Voglio sapere la differenza tra FIQ e IRQ interrupt di sistema ogni microprocessore, e.g:ARM926EJ.

È stato utile?

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

  1. 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 solo r8-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 in r8 la prossima volta che viene chiamato.
  2. 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 da 0x1C.Questo consente di risparmiare un paio di cicli per l'ingresso ISR.
  3. 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?

  1. 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 ARM ATPCS chiamata di procedura standard saranno, invece, utilizzare i registri r0-r3 per scratch valori e la volontà di non produrre la corretta cpsr il ripristino codice di ritorno alla fine della funzione.
  2. 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,

  1. Modalità separata con sopraelevate registrare tra stack, link registrazione e R8-R12.
  2. Separato FIQ enable/disable bit.
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top