Interruzioni


Un'interruzione è un segnale che comunica alla CPU il verificarsi di un evento, per es. come abbiamo visto nella lezione sulle interfacce, la richiesta di scambio dati con una periferica.  Un'interruzione può essere provocata da:
Le Interruzioni provocate dall'hardware esterno possono essere di tue tipi:

Al verificarsi di un’interruzione la CPU interrompe il programma in esecuzione ed esegue un sottoprogramma, chiamato routine di interrupt, allocato ad uno specifico indirizzo di memoria. Terminata la routine d'interrupt, la CPU torna al programma precedentemente interrotto e ne prosegue l'esecuzione.

Vediamo in dettaglio come si svolge questo processo in real mode

Ricevuto il segnale di interrupt la CPU completa l'esecuzione dell'istruzione corrente e salva nello stack il registro di flag e l'indirizzo logico dell'istruzione successiva del programma corrente

Quindi legge un codice di 8 bit che è compito della periferica inviare sul bus dati (gli 8 bit meno significativi). Questo codice si chiama vettore d'interruzione e viene utilizzato dalla CPU come un indice per accedere ad una tabella in memoria, la tabella delle interruzioni (Interrupt Vector Table), contenente gli indirizzo logici delle routine d'interrupt.  La tabella è allocata (sempre in real mode) nella parte bassa della RAM e ha una dimensione fissa di 1KB. Essa contiene 255 indirizzi logici (vi ricordo che ogni indirizzo logico è 4 bytes) di altrettante routine di gestione di tutti i tipi di interruzione (interne, software, hardware). 
Come si vede in figura, ogni vettore d'interruzione punta ad un sottoprogramma allocato in determinato segmento di memoria.  

Se l'interruzione è mascherabile, la CPU, prima di iniziare  le operazioni descritte, invia alla periferica il segnale INTA con cui comunica che l'interruzione è stata accettata. A questo punto la periferica deve inviare il vettore d'interruzione. In assenza di tale segnale la richiesta viene considerata non accolta. 
L'abilitazione o meno delle interruzioni dipende dal flag IF del registro di flag del processore. Se  IF=1 le interruizioni sono abilitate, se IF=0 sono disabilitate. L'assembler fornisce due istruzioni a questo scopo: STI che pone IF=1 e CLI che pone IF=0.  
Occorre comunque tenere presente che la CPU resetta IF automaticamente dopo l'accettazione di un interruzione. Il compito di riabilitare le interruzioni quindi spetta al programmatore che dovrà inserire in un punto opportuno della sua routine d'interrupt  l'istruzione STI.

La gestione delle interruzioni mascherabili comporta due problemi:

Entrambi i problemi vengono risolti interponendo fra le periferiche e la CPU un componente programmabile che controlla le interruzioni, il PIC 8259 (Programmable Interrupt Controller)

 

Il PIC possiede 8 linee d'ingresso, IRQ0, IRQ1,...,IRQ7, collegate le richieste d'interruzione provenienti dalle singole periferiche e una linea d'uscita, collegata con l'ingresso INTR del processore. l PIC inoltre assegna alle richieste di interruzione un ben definito schema di priorità: IRQ0 è la più alta, IRQ7 la più bassa. 
Per gestire/inoltrare  le richiesteIl PIC utilizza  due registri : IRR (Interrupt Request Register) e ISR (inService Register).
Nel registro IRR vengono memorizzate le richieste d'interruzione: per es. se arriva una richiesta sul pin IRQ4, il bit 4 di IRR viene posto a 1. 
Nel registro ISR vengono invece registrate le interruzioni in esecuzione sulla CPU: per es. se la richiesta su IRQ4 viene accettata il bit 4 di ISR viene posto a 1.
Vediamo ora come il PIC gestisce le interruzioni multiple.

Come fa il PIC a riconoscere il termine di una routine di interrupt? Anche questa volta è compito del programmatore comunicare la fine della routine. Egli dovrà inviare al PIC  un comando specifico chiamato End Of Interrupt.

Questo modo di operare viene chiamato Fully Nested Interrupt.

Vediamo ora come viene risolto il problema del riconoscimento della periferica.

Quando inoltra una richiesta d'interruzione il PIC mette sul BUS della CPU un numero di 8 bit, chiamato vettore d'interruzione. Ogni periferica ha un vettore d'interruzione diverso.

Nel PC sono presenti due PIC collegate come Master-Slave.

La richiesta d''interruzione (linea INT) dello Slave è collegata con la linea IRQ2 del Master. Quindi lo Slave effettua le richieste direttamente al MAster che a sua volta le inoltra alla CPU.

Il vettore d'interrupt lo invia lo Slave.

In figura è riportata la configurazione del PIC Master nel PC. In real mode, i vettori d'interruzione vanno da 8 (timer) a 15 (stampante)