Controllore di interruzioni programmabile: differenze tra le versioni

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
Contenuto cancellato Contenuto aggiunto
Alexbot (discussione | contributi)
Zetazeti (discussione | contributi)
Nessun oggetto della modifica
Riga 1: Riga 1:
Un '''Controllore di Interruzioni Programmabile''' ('''PIC''', '''Programmable Interrupt Controller''') è un dispositivo hardware che consente di gestire '''[[interrupt|interruzioni]]''' vettorizzate con priorità per conto di un '''[[processore]]''' (detto anche '''[[CPU]]''', vale a dire '''Central Processing Unit''').
Un '''Controllore di Interruzioni Programmabile''' ('''PIC''', '''Programmable Interrupt Controller''') è un dispositivo hardware che consente di gestire [[interrupt|interruzioni]] vettorizzate con priorità per conto di un [[processore]] (detto anche [[CPU]], vale a dire Central Processing Unit).


== Funzionamento ==
== 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 | disco rigido]]''', 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.
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 | disco rigido]], 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 e se ce n'è più di uno adotta un meccanismo di priorità prefissato per scegliere quello più prioritario. A questo punto, il PIC 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 ('''[[Interrupt Service Routine|ISR]]''', ovvero '''[[Interrupt Service Routine]]''') che il processore stesso dovrà eseguire per soddisfare la richiesta del dispositivo più prioritario. 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 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 e se ce n'è più di uno adotta un meccanismo di priorità prefissato per scegliere quello più prioritario. A questo punto, il PIC 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 ([[Interrupt Service Routine|ISR]], ovvero [[Interrupt Service Routine]]) che il processore stesso dovrà eseguire per soddisfare la richiesta del dispositivo più prioritario. 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 '''[[piedino (elettronica)|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 contemporaneamente, 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).
Il PIC prevede un certo numero di [[piedino (elettronica)|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 contemporaneamente, 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.
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 ==
== Caratteristiche comuni ==
I PIC presentano di solito un insieme di '''[[registro (informatica) | 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.
I PIC presentano di solito un insieme di [[registro (informatica) | 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 PIC tra cui quelli a priorità fissa, a priorità prestabilita o a priorità rotante.
Come già detto, ci sono diversi meccanismi di priorità previsti dai PIC tra cui quelli a priorità fissa, a priorità prestabilita o a priorità rotante.
Riga 24: Riga 24:
Un '''vantaggio''' di un tale tipo di approccio sta nel fatto che si evita che un impulso spurio venga interpretato inavvertitamente come una richiesta di interruzione: se tale impulso è, come di solito capita, di breve durata allora esso non viene "sentito". Le interruzioni sul livello, pertanto, sono più robuste rispetto a quelle sul fronte in presenza di linee rumorose per questa loro capacità di filtrare i segnali spuri.
Un '''vantaggio''' di un tale tipo di approccio sta nel fatto che si evita che un impulso spurio venga interpretato inavvertitamente come una richiesta di interruzione: se tale impulso è, come di solito capita, di breve durata allora esso non viene "sentito". Le interruzioni sul livello, pertanto, sono più robuste rispetto a quelle sul fronte in presenza di linee rumorose per questa loro capacità di filtrare i segnali spuri.


Molti dispositivi possono '''condividere''' una linea di interruzione sul livello se sono opportunamente progettati. La linea deve avere un '''[[resistore]]''' di pull-down o di pull-up così da tenere il segnale, in condizioni di riposo, rispettivamente basso oppure alto (stato quindi non attivo, ossia di non richiesta di interruzione). Quando uno o anche più dispositivi vogliono interrompere, attivano la linea, ossia la portano al livello alto oppure basso e la mantengono così, come già detto, '''per tutto il tempo''', fino a quando viene detto al dispositivo interrompente che la sua ISR è stata eseguita e che quindi può smettere di tenere attiva la linea.
Molti dispositivi possono '''condividere''' una linea di interruzione sul livello se sono opportunamente progettati. La linea deve avere un [[resistore]] di pull-down o di pull-up così da tenere il segnale, in condizioni di riposo, rispettivamente basso oppure alto (stato quindi non attivo, ossia di non richiesta di interruzione). Quando uno o anche più dispositivi vogliono interrompere, attivano la linea, ossia la portano al livello alto oppure basso e la mantengono così, come già detto, '''per tutto il tempo''', fino a quando viene detto al dispositivo interrompente che la sua ISR è stata eseguita e che quindi può smettere di tenere attiva la linea.


Quando la linea di interruzione condivisa da più dispositivi viene attivata, bisogna scoprire chi è stato a farlo. Una volta servito il dispositivo interrompente e richiestogli di smettere di tenere attiva la linea, può succedere che quest'ultima ritorni al suo stato inattivo, di riposo, o che continui ad essere attiva. Nel primo caso significa che una volta servito il dispositivo interrompente non ce n'erano altri che richiedevano attenzione. Nel secondo caso significa che un altro dispositivo ha cominciato a richiedere attenzione, ma si stava servendo il dispositivo precedente: bisogna di nuovo scoprire chi altro ha richiesto l'interruzione. Una volta servito, il discorso si ripete.
Quando la linea di interruzione condivisa da più dispositivi viene attivata, bisogna scoprire chi è stato a farlo. Una volta servito il dispositivo interrompente e richiestogli di smettere di tenere attiva la linea, può succedere che quest'ultima ritorni al suo stato inattivo, di riposo, o che continui ad essere attiva. Nel primo caso significa che una volta servito il dispositivo interrompente non ce n'erano altri che richiedevano attenzione. Nel secondo caso significa che un altro dispositivo ha cominciato a richiedere attenzione, ma si stava servendo il dispositivo precedente: bisogna di nuovo scoprire chi altro ha richiesto l'interruzione. Una volta servito, il discorso si ripete.
Riga 32: Riga 32:
Ci sono alcuni '''svantaggi''' con le interruzioni sul livello. Se la linea è condivisa e si sta servendo un dispositivo, non si può capire se ce n'è un altro che ha poco dopo cominciato a richiedere anch'esso l'interruzione: bisogna finire con il primo e dirgli di smettere di tenere attiva la linea per poi scoprire che ce n'era un altro che pure chiedeva attenzione. Appunto per questo non è consigliabile '''prendersela comoda''' a servire un dispositivo meno prioritario se sulla stessa linea ce n'è uno più prioritario: si corre il rischio che quest'ultimo debba aspettare a lungo per il completamento della ISR del primo dispositivo. Un altro inconveniente è dovuto al fatto che se non si sa come trattare l'interruzione di un dispositivo interrompente, quest'ultimo potrebbe tenere '''indefinitamente attiva la linea''' impedendo agli altri di segnalare la propria richiesta di interruzione.
Ci sono alcuni '''svantaggi''' con le interruzioni sul livello. Se la linea è condivisa e si sta servendo un dispositivo, non si può capire se ce n'è un altro che ha poco dopo cominciato a richiedere anch'esso l'interruzione: bisogna finire con il primo e dirgli di smettere di tenere attiva la linea per poi scoprire che ce n'era un altro che pure chiedeva attenzione. Appunto per questo non è consigliabile '''prendersela comoda''' a servire un dispositivo meno prioritario se sulla stessa linea ce n'è uno più prioritario: si corre il rischio che quest'ultimo debba aspettare a lungo per il completamento della ISR del primo dispositivo. Un altro inconveniente è dovuto al fatto che se non si sa come trattare l'interruzione di un dispositivo interrompente, quest'ultimo potrebbe tenere '''indefinitamente attiva la linea''' impedendo agli altri di segnalare la propria richiesta di interruzione.


La versione originaria del bus '''[[PCI]]''' prevede le interruzioni sul livello: le versioni più recenti consentono anche l'uso di messaggi di interruzione, diventati l'unica modalità consentita nel '''[[PCI Express]]'''.
La versione originaria del bus [[PCI]] prevede le interruzioni sul livello: le versioni più recenti consentono anche l'uso di messaggi di interruzione, diventati l'unica modalità consentita nel [[PCI Express]].


===Interruzioni sul fronte===
===Interruzioni sul fronte===
Riga 44: Riga 44:
Uno '''svantaggio''' delle interruzioni sul fronte è che una attivazione della linea potrebbe non essere sentita: mentre con l'interruzione sul livello ciò non può succedere perché la linea è tenuta attiva per tutto il tempo richiesto al completamento della ISR, qui il rischio di perdere un'attivazione c'è e può portare a situazioni impreviste. Può verificarsi una situazione di stallo in quanto il dispositivo interrompente aspetta fiducioso di essere servito ma la ISR di cui ha richiesto l'esecuzione non venga mai eseguita perché l'attivazione della linea non è stata sentita.
Uno '''svantaggio''' delle interruzioni sul fronte è che una attivazione della linea potrebbe non essere sentita: mentre con l'interruzione sul livello ciò non può succedere perché la linea è tenuta attiva per tutto il tempo richiesto al completamento della ISR, qui il rischio di perdere un'attivazione c'è e può portare a situazioni impreviste. Può verificarsi una situazione di stallo in quanto il dispositivo interrompente aspetta fiducioso di essere servito ma la ISR di cui ha richiesto l'esecuzione non venga mai eseguita perché l'attivazione della linea non è stata sentita.


Le prime versioni del bus '''[[Industry Standard Architecture|ISA]]''' prevedevano le interruzioni sul fronte, ma non richiedevano che le linee dovessero essere condivise. Le schede ISA montano, comunque, resistori di pull-up sulle linee di interruzione per consentirne la condivisione.
Le prime versioni del bus [[Industry Standard Architecture|ISA]] prevedevano le interruzioni sul fronte, ma non richiedevano che le linee dovessero essere condivise. Le schede ISA montano, comunque, resistori di pull-up sulle linee di interruzione per consentirne la condivisione.


== Controllori di Interruzioni Programmabili noti ==
== Controllori di Interruzioni Programmabili noti ==
Uno dei PIC più conosciuti, l''''[[Intel 8259]]''', 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 '''[[Motherboard | scheda madre]]'''. In altri casi, il PIC è stato completamente sostituito dai più nuovi '''[[Controllore Avanzato di Interruzioni Programmabile|Controllori Avanzati di Interruzioni Programmabili]]''', che supportano più interruzioni e prevedono meccanismi di priorità più flessibili.
Uno dei PIC più conosciuti, l'[[Intel 8259]], 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 [[Motherboard | scheda madre]]. In altri casi, il PIC è stato completamente sostituito dai più nuovi [[Controllore Avanzato di Interruzioni Programmabile|Controllori Avanzati di Interruzioni Programmabili]], che supportano più interruzioni e prevedono meccanismi di priorità più flessibili.


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]]'''.
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]].


==Voci correlate==
==Voci correlate==

Versione delle 01:53, 20 feb 2008

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 disco rigido, 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 e se ce n'è più di uno adotta un meccanismo di priorità prefissato per scegliere quello più prioritario. A questo punto, il PIC 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. 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 contemporaneamente, 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 PIC tra cui quelli a priorità fissa, a priorità prestabilita o a priorità rotante.

Le interruzioni possono essere sia del tipo sul livello (level-triggered) sia del tipo sul fronte (Edge triggered).

Interruzioni sul livello

Nel caso di interruzione sul livello, il segnale proveniente da un dispositivo interrompente deve essere portato da basso ad alto e mantenuto alto (oppure da alto a basso e mantenuto basso) dallo stesso dispositivo interrompente fino a quando gli viene detto che può riportarlo basso (oppure alto) nuovamente.

Un vantaggio di un tale tipo di approccio sta nel fatto che si evita che un impulso spurio venga interpretato inavvertitamente come una richiesta di interruzione: se tale impulso è, come di solito capita, di breve durata allora esso non viene "sentito". Le interruzioni sul livello, pertanto, sono più robuste rispetto a quelle sul fronte in presenza di linee rumorose per questa loro capacità di filtrare i segnali spuri.

Molti dispositivi possono condividere una linea di interruzione sul livello se sono opportunamente progettati. La linea deve avere un resistore di pull-down o di pull-up così da tenere il segnale, in condizioni di riposo, rispettivamente basso oppure alto (stato quindi non attivo, ossia di non richiesta di interruzione). Quando uno o anche più dispositivi vogliono interrompere, attivano la linea, ossia la portano al livello alto oppure basso e la mantengono così, come già detto, per tutto il tempo, fino a quando viene detto al dispositivo interrompente che la sua ISR è stata eseguita e che quindi può smettere di tenere attiva la linea.

Quando la linea di interruzione condivisa da più dispositivi viene attivata, bisogna scoprire chi è stato a farlo. Una volta servito il dispositivo interrompente e richiestogli di smettere di tenere attiva la linea, può succedere che quest'ultima ritorni al suo stato inattivo, di riposo, o che continui ad essere attiva. Nel primo caso significa che una volta servito il dispositivo interrompente non ce n'erano altri che richiedevano attenzione. Nel secondo caso significa che un altro dispositivo ha cominciato a richiedere attenzione, ma si stava servendo il dispositivo precedente: bisogna di nuovo scoprire chi altro ha richiesto l'interruzione. Una volta servito, il discorso si ripete.

E' importante adottare una buona strategia quando si va alla scoperta di chi è stato a interrompere su una linea condivisa: può darsi che alcuni dispositivi tendano a farlo più frequentemente ma servirli costa poco (si gesticono cioè velocemente), mentre altri lo fanno magari meno frequentemente ma servirli è oneroso (la loro ISR è molto pesante). Per aumentare l'efficienza, converrà servire per prima quelli che si accontentano di poco per poi passare a quelli che monopolizzano il processore.

Ci sono alcuni svantaggi con le interruzioni sul livello. Se la linea è condivisa e si sta servendo un dispositivo, non si può capire se ce n'è un altro che ha poco dopo cominciato a richiedere anch'esso l'interruzione: bisogna finire con il primo e dirgli di smettere di tenere attiva la linea per poi scoprire che ce n'era un altro che pure chiedeva attenzione. Appunto per questo non è consigliabile prendersela comoda a servire un dispositivo meno prioritario se sulla stessa linea ce n'è uno più prioritario: si corre il rischio che quest'ultimo debba aspettare a lungo per il completamento della ISR del primo dispositivo. Un altro inconveniente è dovuto al fatto che se non si sa come trattare l'interruzione di un dispositivo interrompente, quest'ultimo potrebbe tenere indefinitamente attiva la linea impedendo agli altri di segnalare la propria richiesta di interruzione.

La versione originaria del bus PCI prevede le interruzioni sul livello: le versioni più recenti consentono anche l'uso di messaggi di interruzione, diventati l'unica modalità consentita nel PCI Express.

Interruzioni sul fronte

Nel caso di interruzione sul fronte, basta che il dispositivo interrompente porti per un determinato intervallo di tempo il segnale da basso ad alto oppure da alto a basso perché lo stesso venga automaticamente sentito: viene infatti sentito il fronte rispettivamente di salita o di discesa del segnale, ossia la transizione da un livello ad un altro. Il dispositivo interrompente riporterà quindi la linea bassa o alta (condizione di riposo), senza che, a differenza di prima, gli venga ordinato di farlo: rimarrà poi in fiduciosa attesa che venga eseguita la sua ISR.

Anche qui può ripetersi il discorso dei resistori di pull-down o di pull-up e della linea condivisa da più dispositivi.

Un vantaggio delle interruzioni sul fronte è che, mentre si sta servendo un dispositivo, poiché la linea è stata attivata brevemente ma subito dopo disattivata (è quindi "libera"), può essere sentito un secondo dispositivo che nel frattempo richiede attenzione: ciò non è possibile con le interruzioni sul livello. Quindi, si può capire se un dispositivo più prioritario sta chiedendo un'interruzione e servirlo, interrompendo il servizio del dispositivo meno prioritario che pure era in corso. Un altro vantaggio è che si può anche decidere di prendersela comoda a servire un dispositivo meno prioritario, tanto la linea condivisa è libera e non si corre il rischio di non sentire l'interruzione che nel frattempo il dispositivo più prioritario richiede.

Uno svantaggio delle interruzioni sul fronte è che una attivazione della linea potrebbe non essere sentita: mentre con l'interruzione sul livello ciò non può succedere perché la linea è tenuta attiva per tutto il tempo richiesto al completamento della ISR, qui il rischio di perdere un'attivazione c'è e può portare a situazioni impreviste. Può verificarsi una situazione di stallo in quanto il dispositivo interrompente aspetta fiducioso di essere servito ma la ISR di cui ha richiesto l'esecuzione non venga mai eseguita perché l'attivazione della linea non è stata sentita.

Le prime versioni del bus ISA prevedevano le interruzioni sul fronte, ma non richiedevano che le linee dovessero essere condivise. Le schede ISA montano, comunque, resistori di pull-up sulle linee di interruzione per consentirne la condivisione.

Controllori di Interruzioni Programmabili noti

Uno dei PIC più conosciuti, l'Intel 8259, 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 dai più nuovi Controllori Avanzati di Interruzioni Programmabili, che supportano più interruzioni e prevedono meccanismi di priorità più flessibili.

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.

Voci correlate