Programmable Interrupt Controller

.

Un Controllore di Interruzioni Programmabile (PIC, Programmable Interrupt Controller) è un dispositivo hardware che consente di gestire interruzioni vettorizzate con priorità per conto di un processore (detto anche CPU, vale a dire Central Processing Unit).

Funzionamento

Per meglio comprenderne il funzionamento, immaginiamo che il PIC non ci sia e che il processore debba vedersela in prima persona nella gestione delle interruzioni. Quando un dispositivo, che può essere ad esempio un hard disk, un floppy disk, una porta seriale, una porta parallela, la tastiera, il mouse, ecc., richiede un servizio in tempo reale, attiva un segnale di interruzione. Il processore, normalmente, ha un solo ingresso per sentire che qualcuno lo sta chiamando in causa ("interrompendolo" nelle sue normali faccende): quindi, tutti i dispositivi (e sono tanti) che vogliono interromperlo, "confluiscono" sull'unico ingresso che il processore mette a disposizione per sentire le interruzioni. Una volta interrotto, il processore deve andare in giro a chiedere chi, tra i tanti dispositivi, ha attivato l'interruzione. Ciò, ovviamente, gli fa perdere tempo soprattutto se, come detto, i candidati possono essere tanti. A peggiorare la situazione, può inoltre succedere che più di un dispositivo, contemporaneamente, richieda l'interruzione: in tal caso il processore deve prevedere un meccanismo di priorità per determinare quale tra più interruzioni pendenti deve servire per primo.

Il PIC si frappone tra tutti i dispositivi che richiedono l'interruzione e il processore: si prende quindi carico di sentire se ci sono dispositivi che stanno interrompendo, se ce n'è più di uno adotta un meccanismo di priorità prefissato per scegliere quello più prioritario e infine attiva l'unica linea di interruzione del processore, dandogli anche il "vettore" dell'interruzione, dal quale si ottiene, grazie ad una tabella, l'indirizzo del programma (ISR, ovvero Interrupt Service Routine) che il processore stesso dovrà eseguire per soddisfare la richiesta del dispositivo più prioritario che ne ha richiesto l'intervento. Come si vede, il processore non dovrà più preoccuparsi di andare in giro e stabilire quale interruzione dovrà servire per primo: l'unica cosa che dovrà fare sarà quella di eseguire il programma di interruzione (ISR) che gli verrà indicato dal PIC.

Il PIC prevede un certo numero di piedini (pin) di ingresso (ad esempio IRQ0, IRQ1,...,IRQ7), ognuno dei quali "sente" un determinato dispositivo che vuole interrompere. Se più di un pin viene attivato contemporaneame, scatta un meccanismo di priorità che può essere di vario tipo: si può ad esempio avere quello con priorità fisse (IRQ0 è più prioritario di IRQ1, che a sua volta è più prioritario di IRQ2, che a sua volta è più prioritario di IRQ3 e così via fino a IRQ7), oppure quello con priorità a rotazione (se è stato appena servito IRQ4, allora IRQ5 diventa il più prioritario seguito nell'ordine da IRQ6, IRQ7, IRQ0, ... fino a IRQ4 che è diventato il meno prioritario in quanto il processore lo ha appena finito di servire e quindi deve lasciare spazio agli altri).

I PIC spesso consentono di essere messi in cascata in modo che possano essere sentite le interruzioni di moltissimi dispositivi. Ad esempio, si possono trovare dei PIC che utilizzati singolarmente possono sentire solo 8 diversi dispositivi interrompenti: per poterne invece sentire fino a 64, è possibile utilizzarne 9 collettivamente, con 8 di essi (detti Slave) che sentono ciascuno 8 dispositivi interrompenti per un totale appunto di 64 e con un nono PIC (detto Master) che sente le interruzioni provenienti dagli 8 PIC Slave. Sarà poi il PIC Master a interrompere il processore fornendogli uno dei 64 vettori possibili cosicché possa essere servito quello tra i 64 dispositivi con la priorità di interruzione più alta.

Caratteristiche Comuni

I PIC presentano di solito un insieme di registri comuni: l'Interrupt Request Register (IRR), l'In-Service Register (ISR), l'Interrupt Mask Register (IMR). Il registro di richiesta delle interruzioni, IRR, specifica quali interruzioni sono state attivate dai dispositivi interrompenti: è un registro simbolico non accessibile direttamente ai programmatori. Il registro dell'interruzione attualmente in servizio, ISR, specifica quale interruzione il processore sta attualmente servendo, eseguendone la relativa ISR, ma che non si è ancora conclusa. Il registro di maschera delle interruzioni, IMR, specifica quali interruzioni devono essere ignorate.

Come già detto, ci sono diversi meccanismi di priorità previsti dai PICs tra cui quelli a priorità fissa, a priorità prestabilita o a priorità rotante.

Le interruzioni possono essere sia del tipo a livello (level-triggered) sia del tipo sul fronte (edge triggered). Nel primo caso, il segnale di interruzione proveniente da un dispositivo interrompente in ingresso a uno dei pin del PIC deve essere portato ad esempio da basso ad alto e mantenuto alto dal dispositivo fino a quando il PIC "decide" di sentirlo. Nel secondo caso, basta che il dispositivo interrompente porti per un determinato intervallo di tempo il segnale da basso ad alto perché il segnale venga automaticamente sentito dal PIC: quest'ultimo infatti sente il fronte del segnale, ossia che esso si è portato da basso ad alto dopodiché il dispositivo interrompente può anche riportarlo basso tanto il fronte stesso è stato già sentito dal PIC.

Controllori di Interruzioni Programmabili noti

Uno dei PIC più conosciuti, l'8259A, era, nei tempi andati, incluso nei PC x86. Oggi, non è più un dispositivo a sé: la sua funzione è stata inclusa all'interno del chipset southbridge della scheda madre. In altri casi, il PIC è stato completamente sostituito da uno più nuovo, l'Advanced Programmable Interrupt Controllers, che supporta più interruzioni e prevede meccanismi di priorità più flessibili.

Ulteriori informazioni

Maggiori informazioni sul PIC 8259 dell'Intel possono essere trovate in IA-32 Intel® Architecture Software Developer’s Manual, Volume 3A: System Programming Guide, Part 1, liberamente disponibili sul sito della Intel.

See also