7

Voglio capire la differenza tra ISR (Interrupt Service Routine) e Function call.Differenza tra ISR e chiamata di funzione?

Sento che sia la chiamata di funzione che ISR sono le stesse dal punto di vista dell'hardware. Perfavore, correggimi se sbaglio. Tutto quello che potevo trovato su ISR e chiamata funzione è la seguente:

ISR:

  • asincrono evento che può verificarsi in qualsiasi momento durante l'esecuzione del programma

  • Salva il PC, bandiere e registri in pila e disabilita tutti gli interrupt e carica l'indirizzo dell'ISR

  • ISR non può avere argomenti che possono essere passati ad esso

  • non può restituire i valori
  • Abilita gli interrupt
  • generalmente di piccole dimensioni, come si stanno prendendo il tempo di qualche altro processo
  • Alcuni di ISR ​​hanno hanno il proprio impilare

Funzione:

  • Si verifica quando mai v'è una chiamata di funzione

  • Salva il PC e registri sulla pila

  • può avere argomenti

  • possono restituire valori

  • Nessuna limitazione delle dimensioni e durata dell'esecuzione

C'è altra differenza oltre a questo? Per favore mi faccia sapere. Ho anche letto di avere una chiamata di funzione da ISR come avviene. Per favore, evidenzia su di esso.

risposta

1

Essi non sono necessariamente uguali a quelli del proprio statet nel primo punto degli ISR: Gli interrupt sono asincroni e quindi devono in qualche modo "interrompere" il lavoro del/dei processore/i principale/i.

Ad esempio, consente di guardare a questo codice MIPS decorato con indirizzi, che non fa nulla di utile:

4000.  add $1, $2, $3 
4004.  sw $ra, 0($sp) 
4008.  jal subr # function call, sets $ra to 4012 and jumps to 4024 
4012.  lw $ra, 0($sp) 
4016.  jr $ra 
4020. 
4024. subr: sub $2, $1, $3 
4028.  jr $ra 

Questo codice può essere handeled dal processore principale: le operazioni aritmetiche (linee 1, 7) vengono eseguiti dall'unità aritmetica, dall'accesso alla memoria (righe 2, 4) dal controller di memoria e i salti (righe 3, 5, 8) vengono eseguiti anche dalla CPU principale. (L'indirizzo effettivo di jal viene impostato durante l'associazione del file oggetto.)

Questo è per le chiamate di funzione.In qualsiasi momento viene determinato, dove il codice è in questo momento e quale codice viene eseguito al momento successivo (ad esempio quando il contatore del programma viene incrementato: PC + = 4).

Ora arriva il momento, quando le tue funzioni fanno qualcosa di complicato ma vuoi comunque che il software reagisca su un colpo di chiave. Quindi entra in gioco un cosiddetto coprocessore. Questo coprocessore attende fino a quando si verifica qualche evento (come un colpo di tasto sulla tastiera) e quindi chiama il gestore di interrupt. Questo è un blocco di codice situato su un determinato indirizzo nella memoria.

Think, il processore è nel calcolo sopra, ma nel frattempo si desidera memorizzare il numero di tratti chiave all'indirizzo keys. Poi si scrive un programma a partire dall'indirizzo 0x80000180 (questo è definito come l'indirizzo del gestore esibirci in MIPS):

lw $at, keys 
addi $at, $at, 1 
sw $at, keys 
eret 

Ora che cosa accade ad un tasto?

  1. Il coprocessore ottiene consapevole del tasto
  2. La corrente PC del procesor principale viene salvato
  3. Il PC del processore principale è impostato su 0x80000180, il codice di interrupt viene eseguita
  4. Sulla eret la Il PC è impostato sul PC del processore principale prima che si verificasse l'interruzione
  5. L'esecuzione del programma principale continua lì.

Qui v'è un interruttore dall'esecuzione normale interrompere movimentazione tra i passaggi 2 e 3 e di nuovo da 4 a 5.

Nota: ho semplificato questo molto, ma deve essere chiaro, come gli interrupt sono diversi dalle chiamate alle funzioni e il modo in cui l'hardware deve disporre di ulteriori funzionalità per la gestione degli interrupt.

+0

Purtroppo non posso offrire risorse online su questo, dal momento che questo si basa su un copione scritto per i sistemi informatici;) – contradictioned

+0

Così lo fa significa che per un microprocessore come 8051 o un microcontrollore 8091 che non ha un coprocessore avrà interrupt e chiamate di funzione uguali? Per favore aiutami, sono davvero confuso –

+1

Non sono un esperto di microcontrollori, ma su questo sito c'è uno schema a blocchi dell'8051: http://aninditadhikary.wordpress.com/tag/intel-8051/ dove puoi vedere il 'Interrupt Control', che si trova accanto alla CPU, simile al coprocessore mips. – contradictioned

2

La differenza principale è che i gestori di interrupt sono, (di solito), richiamati dall'hardware periferico - un segnale hardware effettivo viene generato dalla periferica e l'hardware nel processore trasferisce il controllo al gestore appropriato senza alcuna azione da parte del codice che era correndo prima dell'interruzione. A differenza delle funzioni, non c'è nessuna chiamata: l'esecuzione viene strappata dal codice interrotto dall'hardware del processore.

Su sistemi operativi che supportano il multithreading/processi, le chiamate di funzione avvengono nello stesso contesto processo/thread del chiamante. Un interrupt, OTOH, non ha un contesto di thread o processo: un interrupt di rete risultante da uno sfondo può verificarsi il download di BitTorrent mentre si sta modificando un documento di Word, e quindi il gestore è molto limitato in ciò che può fare. Può caricare dati su/da buffer pre-allocati appartenenti al processo/thread a cui è associato, può segnalare un semaforo, potrebbe essere in grado di impostare i flag di evento OS. Questo è tutto.

Spesso un gestore di interrupt esegue direttamente un interrupt-return, consentendo quindi l'esecuzione del codice interrotto senza ulteriori interferenze. Sui controller più semplici, come yopur 8051, che spesso eseguono codice incorporato senza un sistema operativo compex, questo è l'unico corso disponibile. Con un OS preinstallato con multithreading, un gestore di interrupt ha l'opzione aggiuntiva di eseguire il proprio interrupt-return tramite il codice del SO e quindi causare l'esecuzione di uno scheduler. Ciò consente ai gestori di interrupt di creare thread che erano in attesa di interrupt pronti e possibilmente in esecuzione (e quindi forse di anticipare il thread che era stato originariamente interrotto). Ciò consente a tali sistemi di avere buone prestazioni di I/O senza alcun polling.

Le origini di interrupt hardware sono le periferiche incorporate nel chip del processore: controller di rete, controller disco, controller di visualizzazione, controller DMA, controller USB, controller intercore-comms, (su processori con più core), timer ecc. O interrupt -request pin/s sul pacchetto può essere usato per generare un interrupt da una fonte hardware esterna, (magari un pulsante, tastiera, tastiera o hardware touchscreen).

2

Quindi, avendo affermato che sono uguali, si va avanti per elencare i modi in cui sono diversi - che forse piuttosto risponde alla tua domanda.

I tuoi primi quattro punti sugli ISR ​​sono generalmente e generalmente veri. I punti sull'attivazione degli interrupt non sono necessariamente il caso ed è una decisione di implementazione da parte del programmatore, e possono essere determinati dall'architettura, ed essere piccoli è una linea guida non un requisito - e "piccolo" è interamente soggettivo. "

Le differenze non sono tanto rispetto a come sono codificate (sebbene l'ISR tipicamente imponga un numero di restrizioni e possa anche avere privilegi che le normali funzioni non lo fanno), ma piuttosto come vengono invocati e il comportamento del processore.

Una funzione (o una routine o sub-routine più in generale) deve essere chiamata in modo esplicito e fa parte dello stesso contesto e thread di esecuzione del relativo chiamante Un ISR hardware non viene chiamato esplicitamente ma invocato da qualche evento esterno (esterno a il pro nucleo del cessore che è - le periferiche on-chip possono generare interrupt). Quando viene chiamato un interrupt, il contesto del thread corrente viene automaticamente preservato prima di passare al contesto dell'ISR. Al ritorno, l'interruttore di contesto inverso si verifica ripristinando lo stato del processore prima dell'interruzione in modo che l'esecuzione continui dal punto di interruzione.

Il meccanismo può essere complicato dalla presenza di un sistema operativo multi-thread o di uno schedulatore in cui l'ISR stesso può causare un cambio di contesto di thread in modo che al ritorno da un ISR viene attivato un diverso thread di esecuzione o contesto. Tali meccanismi sono gestiti dal sistema operativo in questo caso.

C'è un altro tipo di ISR ​​supportato su alcuni processori - quello di un software interrompe. Un interrupt software viene utilizzato come una chiamata di funzione nel senso che è esplicitamente invocato da un'istruzione piuttosto che da un singolo evento, ma offre un meccanismo indiretto in base al quale il chiamante non ha bisogno di conoscere l'indirizzo dell'ISR e infatti l'indirizzo potrebbe cambiare . In questo senso è poco diverso dal chiamare una funzione attraverso un puntatore, ma poiché è un ISR che viene eseguito nel contesto dell'interrupt, non nel contesto del chiamante, quindi potrebbe avere restrizioni e privilegi che una funzione normale non possiede.

Fondamentalmente un interrupt è in grado di rispondere direttamente e in modo deterministico a eventi in cui altrimenti è possibile eseguire il polling o il test di un evento, gestirlo ma gestirlo solo nel momento in cui si sceglie di testarlo anziché sul suo verificarsi effettivo , che può essere variabile e inaccettabilmente lungo.

1

Le risposte di cui sopra sono praticamente complete ... una nota speciale per gli interrupt del software di Clifford.

L'unica aggiunta che vorrei fare è questa. Il contesto del registro memorizzato su una chiamata di funzione è definito dalla convenzione di chiamata della procedura per l'architettura della CPU. Questo di solito significa che il chiamante salva qualcosa sullo stack e il chiamato salva alcune cose ed è praticamente un set statico. Eccezione: IA64 che ha una finestra dinamica del registro salva/ripristina.

Su ISR, l'unico contesto del registro memorizzato è ciò che verrà utilizzato nell'ISR. Se si utilizza un registro, solo quel registro viene salvato/ripristinato.

Sulla maggior parte dei cpu, il registro impostato memorizzato/ripristinato in una chiamata di funzione è molto più grande di quelli memorizzati/ripristinati in un ISR a causa della natura statica delle convenzioni di chiamata di procedura.

0

Una chiamata di funzione è in genere generata dal programma.

Generalmente un interrupt viene generato dall'hardware.

ad esempio: Se si programma in C, si chiama la funzione eseguendo la funzione. C'è la funzione principale e le sotto-funzioni. Le funzioni secondarie sono programmate dal programmatore.

Gli interrupt tuttavia sono specifici dell'hardware. ad esempio: In un computer, la CPU sta elaborando un programma ed eseguendolo. Se si preme un tasto sulla tastiera, la tastiera imposta quindi l'interrupt della tastiera sulla CPU. Ora la CPU può agire sull'azione con i tasti.

Il modo migliore per riassumere? 1. le funzioni sono create dai programmatori. 2. interrupt sono fisicamente progettati nell'hardware e utilizzati da altri componenti hardware https://www.youtube.com/SaqibJaved