Sistemi integrati - Interruzioni
Un interrupt è un segnale al processore emesso dall'hardware o dal software che indica un evento che richiede attenzione immediata. Ogni volta che si verifica un interrupt, il controller completa l'esecuzione dell'istruzione corrente e avvia l'esecuzione di un fileInterrupt Service Routine (ISR) o Interrupt Handler. ISR dice al processore o al controller cosa fare quando si verifica l'interruzione. Gli interrupt possono essere interrupt hardware o interrupt software.
Interruzione hardware
Un interrupt hardware è un segnale di avviso elettronico inviato al processore da un dispositivo esterno, come un controller del disco o una periferica esterna. Ad esempio, quando si preme un tasto sulla tastiera o si sposta il mouse, vengono attivati interrupt hardware che fanno sì che il processore legga la sequenza di tasti o la posizione del mouse.
Interruzione software
Un interrupt software è causato da una condizione eccezionale o da un'istruzione speciale nel set di istruzioni che causa un interrupt quando viene eseguito dal processore. Ad esempio, se l'unità logica aritmetica del processore esegue un comando per dividere un numero per zero, per causare un'eccezione di divisione per zero, facendo sì che il computer abbandoni il calcolo o visualizzi un messaggio di errore. Le istruzioni di interrupt software funzionano in modo simile alle chiamate di subroutine.
Cos'è il polling?
Lo stato del monitoraggio continuo è noto come polling. Il microcontrollore continua a controllare lo stato di altri dispositivi; e mentre lo fa, non esegue altre operazioni e consuma tutto il tempo di elaborazione per il monitoraggio. Questo problema può essere risolto utilizzando gli interrupt.
Nel metodo di interruzione, il controller risponde solo quando si verifica un'interruzione. Pertanto, il controller non è tenuto a monitorare regolarmente lo stato (flag, segnali, ecc.) Dei dispositivi interfacciati e integrati.
Interrompe il polling di v / s
Ecco un'analogia che differenzia un'interruzione dal polling:
Interrompere | Polling |
---|---|
Un'interruzione è come un file shopkeeper. Se uno ha bisogno di un servizio o di un prodotto, va da lui e lo informa delle sue esigenze. In caso di interruzioni, quando vengono ricevuti i flag oi segnali, notificano al controller che devono essere riparati. | Il metodo di polling è come un file salesperson. Il venditore va di porta in porta mentre richiede l'acquisto di un prodotto o servizio. Allo stesso modo, il controller continua a monitorare i flag o i segnali uno per uno per tutti i dispositivi e fornisce il servizio a qualsiasi componente che necessita del suo servizio. |
Routine di servizio di interruzione
Per ogni interrupt, deve esserci una routine di servizio di interrupt (ISR), o interrupt handler. Quando si verifica un interrupt, il microcontrollore esegue la routine del servizio di interrupt. Per ogni interruzione, c'è una posizione fissa in memoria che contiene l'indirizzo della sua routine di servizio di interruzione, ISR. La tabella delle posizioni di memoria accantonata per contenere gli indirizzi degli ISR è chiamata Tabella dei vettori di interrupt.
Interrompi tabella vettoriale
Ci sono sei interrupt incluso RESET nell'8051.
Interrompe | Posizione ROM (esadecimale) | Pin |
---|---|---|
Interrompe | Posizione ROM (HEX) | |
Seriale COM (RI e TI) | 0023 | |
Timer 1 interrompe (TF1) | 001B | |
Interrupt HW esterno 1 (INT1) | 0013 | P3.3 (13) |
Interrupt HW esterno 0 (INT0) | 0003 | P3.2 (12) |
Timer 0 (TF0) | 000B | |
Ripristina | 0000 | 9 |
Quando il pin di ripristino è attivato, l'8051 salta alla posizione dell'indirizzo 0000. Questo è il ripristino all'accensione.
Due interrupt sono riservati ai timer: uno per il timer 0 e uno per il timer 1. Le posizioni di memoria sono rispettivamente 000BH e 001BH nella tabella dei vettori di interrupt.
Due interrupt sono riservati agli interrupt hardware esterni. Pin n. 12 e Pin n. 13 nella porta 3 sono rispettivamente per gli interrupt di processo esterni INT0 e INT1. Le posizioni di memoria sono rispettivamente 0003H e 0013H nella tabella del vettore di interrupt.
La comunicazione seriale ha un singolo interrupt che appartiene sia alla ricezione che alla trasmissione. La posizione di memoria 0023H appartiene a questo interrupt.
Passaggi per eseguire un interrupt
Quando un interrupt si attiva, il microcontrollore esegue i seguenti passaggi:
Il microcontrollore chiude l'istruzione attualmente in esecuzione e salva l'indirizzo dell'istruzione successiva (PC) sullo stack.
Inoltre salva internamente lo stato corrente di tutti gli interrupt (cioè, non nello stack).
Salta alla posizione di memoria della tabella del vettore di interrupt che contiene l'indirizzo della routine di servizio degli interrupt.
Il microcontrollore ottiene l'indirizzo dell'ISR dalla tabella dei vettori di interrupt e vi salta. Inizia ad eseguire la subroutine del servizio di interruzione, che è RETI (ritorno dall'interruzione).
Dopo aver eseguito l'istruzione RETI, il microcontrollore torna nella posizione in cui era stato interrotto. Innanzitutto, ottiene l'indirizzo del contatore del programma (PC) dallo stack inserendo i primi byte dello stack nel PC. Quindi, inizia l'esecuzione da quell'indirizzo.
Edge Triggering vs Level Triggering
I moduli di interrupt sono di due tipi: trigger a livello o trigger su fronte.
Livello attivato | Edge Triggered |
---|---|
Un modulo di interrupt attivato dal livello genera sempre un interrupt ogni volta che viene affermato il livello della sorgente di interrupt. | Un modulo di interrupt attivato dal fronte genera un interrupt solo quando rileva un fronte di asserzione della sorgente dell'interrupt. Il limite viene rilevato quando il livello della sorgente di interrupt cambia effettivamente. Può anche essere rilevato mediante campionamento periodico e rilevando un livello affermato quando il campione precedente è stato de-affermato. |
Se l'origine dell'interrupt è ancora asserita quando il gestore di interrupt del firmware gestisce l'interrupt, il modulo di interrupt rigenererà l'interrupt, provocando il richiamo del gestore di interrupt. | I moduli di interrupt attivati dal fronte possono essere attivati immediatamente, indipendentemente dal comportamento della sorgente di interrupt. |
Gli interrupt attivati dal livello sono ingombranti per il firmware. | Gli interrupt attivati dall'edge mantengono bassa la complessità del codice del firmware, riducono il numero di condizioni per il firmware e forniscono maggiore flessibilità quando gli interrupt vengono gestiti. |
Abilitazione e disabilitazione di un interrupt
Al ripristino, tutti gli interrupt vengono disabilitati anche se attivati. Gli interrupt devono essere abilitati utilizzando il software affinché il microcontrollore risponda a tali interrupt.
Il registro IE (interrupt enable) è responsabile dell'abilitazione e della disabilitazione dell'interrupt. IE è un registro indirizzabile a bit.
Interrupt Enable Register
EA | - | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
---|
EA - Abilitazione / disabilitazione globale.
- - Indefinito.
ET2 - Abilita l'interruzione del timer 2.
ES - Abilita l'interrupt della porta seriale.
ET1 - Abilita interrupt Timer 1.
EX1 - Abilita interrupt esterno 1.
ET0 - Abilita interrupt Timer 0.
EX0 - Abilita interrupt esterno 0.
Per abilitare un interrupt, eseguiamo i seguenti passaggi:
Il bit D7 del registro IE (EA) deve essere alto affinché il resto del registro abbia effetto.
Se EA = 1, gli interrupt saranno abilitati e riceveranno risposta se i loro bit corrispondenti in IE sono alti. Se EA = 0, nessun interrupt risponderà, anche se i pin associati nel registro IE sono alti.
Priorità interrupt in 8051
Possiamo modificare la priorità degli interrupt assegnando la priorità più alta a uno qualsiasi degli interrupt. Ciò si ottiene programmando un registro chiamatoIP (priorità di interruzione).
La figura seguente mostra i bit del registro IP. Dopo il ripristino, il registro IP contiene tutti gli 0. Per dare una priorità più alta a qualsiasi interrupt, rendiamo alto il bit corrispondente nel registro IP.
- | - | - | - | PT1 | PX1 | PT0 | PX0 |
---|
- | IP.7 | Non implementato. |
- | IP.6 | Non implementato. |
- | IP.5 | Non implementato. |
- | IP.4 | Non implementato. |
PT1 | IP.3 | Definisce il livello di priorità dell'interrupt del timer 1. |
PX1 | IP.2 | Definisce il livello di priorità dell'interrupt esterno 1. |
PT0 | IP.1 | Definisce il livello di priorità dell'interrupt del timer 0. |
PX0 | IP.0 | Definisce il livello di priorità dell'interrupt esterno 0. |
Interrompi all'interno di Interrupt
Cosa succede se l'8051 sta eseguendo un ISR che appartiene a un interrupt e un altro si attiva? In questi casi, un interrupt ad alta priorità può interrompere un interrupt a bassa priorità. Questo è noto comeinterrupt inside interrupt. In 8051, un interrupt a bassa priorità può essere interrotto da un interrupt ad alta priorità, ma non da un altro interrupt a bassa priorità.
Attivazione di un interrupt dal software
Ci sono momenti in cui dobbiamo testare un ISR tramite simulazione. Questo può essere fatto con le semplici istruzioni per impostare l'interrupt alto e quindi far saltare l'8051 alla tabella dei vettori degli interrupt. Ad esempio, impostare il bit IE come 1 per il timer 1. Un'istruzioneSETB TF1 interromperà l'8051 in qualunque cosa stia facendo e lo costringerà a saltare alla tabella dei vettori di interruzione.