Come fa il controller a sapere quando passare all'ISR?


12

Sto parlando di cose a livello centrale.

Per quanto ho capito, il core del controller esegue solo le istruzioni che vengono recuperate dalla memoria (Fetch - Decode - Execute). Quando arriva un Interrupt, in che modo il core / ALU decide di passare all'ISR?

Poiché noi o il compilatore non aggiungiamo alcuna istruzione per eseguire il polling dello stato di interrupt, come può sapere se è necessario pubblicare un interrupt?

Risposte:


13

Quello che ti manca è che il core fa molto di più che eseguire i codici operativi recuperati dalla memoria. Ha una logica specifica per implementare gli interrupt.

Quando l'hardware di rilevamento degli interrupt afferma il segnale che dice che è il momento di fare un interrupt, di solito nel core viene inserita un'istruzione speciale che non è mai stata recuperata dalla memoria. Nella maggior parte dei casi si tratta di un'istruzione CALL all'indirizzo del vettore di interrupt. Questo utilizza il meccanismo di esecuzione delle istruzioni esistente per salvare il PC corrente nello stack di chiamate e modificarlo nell'indirizzo vettore di interrupt. Si occupa anche di scartare istruzioni precaricate e simili.

La speciale logica di acquisizione degli interrupt deve anche disabilitare gli interrupt in modo tale che la stessa condizione di interrupt non provochi un'altra chiamata all'indirizzo successivo del vettore di interrupt. Processori diversi hanno modi diversi di gestirlo. Il più semplice è disabilitare semplicemente gli interrupt, richiedendo al software di riattivarli al termine della routine del servizio di interrupt. Altri processori hanno un livello di priorità di interrupt. Questo livello viene superato in modo che solo le condizioni di interruzione con priorità più elevata possano causare un nuovo interruzione. La priorità di interruzione è quindi qualcosa che viene automaticamente salvata insieme all'indirizzo di ritorno CALL e ripristinata quando il codice ritorna dall'interruzione.


1
Spesso non è CALLun'istruzione normale , poiché gli interrupt vengono terminati in modo diverso (cfr. RETVs. RETI).
glglgl,

1
Posso tranquillamente supporre che quando l'hardware di rilevamento di Interrupt asserisce il segnale, invece della memoria, la CPU ottiene istruzioni da qualche altra parte per saltare ... Come un interruttore forse ... Quando l'interruttore è spento, recupera le istruzioni dalla memoria e quando l'interruttore è acceso , Eseguire questa istruzione?
Swanand,

3

Comunemente nei moderni microcontrollori esiste un'unità dedicata Interrupt Controller (IC) che si occupa della gestione degli interrupt. Inoltre ogni componente periferico ha un'uscita interrupt (s) che sta andando da 0a 1(o viceversa) se una condizione diffusa (per esempio questa periferica completato un lavoro). Questa uscita è collegata al controller di interrupt. La CoreCPU può dire all'IC di ignorare questo specifico interrupt (mascherarlo) o di avvisare l'MCU ogni volta che si verifica attivando segnali specifici, e quindi l'MCU decide cosa farne. Il modo comune è avere l'IC per dire a MCU quale interruzione è avvenuta e saltare al codice di gestione corrispondente.


2

Nel core del computer è presente un hardware che inserisce un nuovo valore nel contatore del programma che corrisponde al particolare interrupt che è stato attivato. Per ricordare dove tornare dopo il completamento della routine di interruzione, il valore corrente nel contatore del programma viene inserito nello stack prima che l'hardware installi l'indirizzo di interruzione nel contatore del programma. Al termine della routine di interruzione, il valore originale del contatore del programma viene ripristinato fuori dallo stack.

I valori da inserire nel contatore del programma al momento dell'interruzione sono generalmente determinati da uno dei due schemi. Un approccio inserisce un indirizzo fisso per ciascun tipo di interruzione nel contatore del programma e il core del computer inizia quindi l'esecuzione da quella posizione fissa. Lo spazio nella posizione fissa è spesso di dimensioni limitate, quindi è comune codificare un'istruzione di salto agli indirizzi fissi che passa alla posizione effettiva del servizio di interruzione. L'altro schema utilizza qualcosa chiamato una tabella vettoriale di interrupt. Qui l'hardware genera un offset di indirizzo fisso nella tabella vettoriale in base al tipo di interrupt. L'hardware estrae quindi il contenuto nella posizione della tabella e utilizza quel valore come indirizzo per incepparsi nel contatore del programma.


2

Il controller ha un registro per il contatore del programma che tiene traccia dell'indirizzo in cui è memorizzata l'istruzione successiva da eseguire. (Questo registro è anche scritto quando viene eseguito un salto.)

Il controller ha un vettore di interrupt (o talvolta più di uno, a seconda del tipo di interrupt), che è l'indirizzo in cui è memorizzato l'ISR. Questo indirizzo è sempre lo stesso: è come il vettore di ripristino, da cui inizia il programma.

(Spesso, su questo vettore è memorizzata un'istruzione di salto che passa al codice effettivo per l'esecuzione, poiché lo spazio sul vettore non è sufficiente per memorizzare l'intera procedura. Tuttavia, l'importante è che l'ISR si trovi sempre nello stesso posizione.)

Quando si verifica un interrupt, nel controller è presente un hardware dedicato che scrive il contatore del programma con il vettore di interrupt. Quindi, quando il controller raggiunge il ciclo di istruzione successivo, recupera l'istruzione dall'indirizzo a cui punta il contatore del programma (quindi, il vettore di interruzione).

(In un ciclo di istruzioni del controllore ci sono diversi compiti che esegue: recupera l'istruzione successiva dall'indirizzo indicato dal contatore del programma; aumenta il contatore del programma; decodifica l'istruzione ed esegue.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.