b'\n_START_ARTICLE_\nControllore di interruzioni programmabile\n_START_SECTION_\nEsigenza\n_START_PARAGRAPH_\nPer meglio comprenderne il funzionamento, ipotizziamo che il PIC non ci sia e che il processore debba assumersi l\'incarico della gestione delle interruzioni. Quando un dispositivo, quale 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 se qualcuno lo sta chiamando in causa, "interrompendolo" nella sua normale operativit\xc3\xa0: pertanto, tutti i dispositivi che vogliono interromperlo, "confluiscono" sull\'unico ingresso che il processore mette loro a disposizione per tale scopo. Una volta interrotto, il processore deve interrogare i vari dispositivi per individuare chi \xc3\xa8 stato ad attivare l\'interruzione: tutto questo, ovviamente, gli richiede del tempo tanto pi\xc3\xb9 se i candidati sono tanti. La situazione peggiora se pi\xc3\xb9 di un dispositivo, "contemporaneamente", richiede l\'interruzione: in tal caso il processore deve prevedere un meccanismo di priorit\xc3\xa0 per determinare quale tra pi\xc3\xb9 interruzioni pendenti deve servire per primo.\n_START_SECTION_\nFunzione del PIC\n_START_PARAGRAPH_\nIl 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\'\xc3\xa8 pi\xc3\xb9 di uno adotta un meccanismo di priorit\xc3\xa0 prefissato, per scegliere quello pi\xc3\xb9 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\xc3\xa0 eseguire per soddisfare la richiesta del dispositivo pi\xc3\xb9 prioritario. Come si vede, il processore non dovr\xc3\xa0 pi\xc3\xb9 preoccuparsi di andare in giro e stabilire quale interruzione dovr\xc3\xa0 servire per primo: l\'unica cosa che dovr\xc3\xa0 fare sar\xc3\xa0 quella di eseguire il programma di interruzione (ISR) che gli verr\xc3\xa0 indicato dal PIC.\n_START_SECTION_\nPriorit\xc3\xa0\n_START_PARAGRAPH_\nIl 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\xc3\xb9 di un pin viene attivato contemporaneamente, scatta un meccanismo di priorit\xc3\xa0 che pu\xc3\xb2 essere di vario tipo: si pu\xc3\xb2 ad esempio avere quello con  priorit\xc3\xa0 fisse (IRQ0 \xc3\xa8 pi\xc3\xb9 prioritario di IRQ1, che a sua volta \xc3\xa8 pi\xc3\xb9 prioritario di IRQ2, che a sua volta \xc3\xa8 pi\xc3\xb9 prioritario di IRQ3 e cos\xc3\xac via fino a IRQ7), oppure quello con  priorit\xc3\xa0 a rotazione (se \xc3\xa8 stato appena servito IRQ4, allora IRQ5 diventa il pi\xc3\xb9 prioritario seguito nell\'ordine da IRQ6, IRQ7, IRQ0, ... fino a IRQ4 che \xc3\xa8 diventato il meno prioritario in quanto il processore lo ha appena finito di servire e quindi deve lasciare spazio agli altri).\n_START_SECTION_\nCollegamento in cascata\n_START_PARAGRAPH_\nI 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, \xc3\xa8 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\xc3\xa0 poi il PIC Master a interrompere il processore fornendogli uno dei 64 vettori possibili cosicch\xc3\xa9 possa essere servito quello tra i 64 dispositivi con la priorit\xc3\xa0 di interruzione pi\xc3\xb9 alta.\n_START_SECTION_\nCaratteristiche comuni\n_START_PARAGRAPH_\nI 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: \xc3\xa8 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 \xc3\xa8 ancora conclusa. Il registro di maschera delle interruzioni, IMR, specifica quali interruzioni devono essere ignorate. _NEWLINE_Come gi\xc3\xa0 detto, ci sono diversi meccanismi di priorit\xc3\xa0 previsti dai PIC tra cui quelli a priorit\xc3\xa0 fissa, a priorit\xc3\xa0 prestabilita o a priorit\xc3\xa0 rotante._NEWLINE_Le interruzioni possono essere sia del tipo sul  livello (level-triggered) sia del tipo sul  fronte (Edge triggered).\n_START_SECTION_\nInterruzioni sul livello\n_START_PARAGRAPH_\nNel 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\xc3\xb2 riportarlo basso (oppure alto) nuovamente. _NEWLINE_La versione originaria del bus PCI prevede le interruzioni sul livello: le versioni pi\xc3\xb9 recenti consentono anche l\'uso di messaggi di interruzione, diventati l\'unica modalit\xc3\xa0 consentita nel PCI Express.\n_START_SECTION_\nCondivisione delle interruzioni\n_START_PARAGRAPH_\nMolti 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\xc3\xac 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\xc3\xb9 dispositivi vogliono interrompere, attivano la linea, ossia la portano al livello alto oppure basso e la mantengono cos\xc3\xac, come gi\xc3\xa0 detto, per tutto il tempo, fino a quando viene detto al dispositivo interrompente che la sua ISR \xc3\xa8 stata eseguita e che quindi pu\xc3\xb2 smettere di tenere attiva la linea. _NEWLINE_Quando la linea di interruzione condivisa da pi\xc3\xb9 dispositivi viene attivata, bisogna scoprire chi \xc3\xa8 stato a farlo. Una volta servito il dispositivo interrompente e richiestogli di smettere di tenere attiva la linea, pu\xc3\xb2 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._NEWLINE_\xc3\x88 importante adottare una buona strategia quando si va alla scoperta di chi \xc3\xa8 stato a interrompere su una linea condivisa: pu\xc3\xb2 darsi che alcuni dispositivi tendano a farlo pi\xc3\xb9 frequentemente ma servirli costa poco (si gesticono cio\xc3\xa8 velocemente), mentre altri lo fanno magari meno frequentemente ma servirli \xc3\xa8 oneroso (la loro ISR \xc3\xa8 molto pesante). Per aumentare l\'efficienza, converr\xc3\xa0 servire per prima quelli che si accontentano di poco per poi passare a quelli che monopolizzano il processore.\n_START_SECTION_\nVantaggi e svantaggi\n_START_PARAGRAPH_\nUn vantaggio delle interruzioni sul livello sta nel fatto che si evita che un impulso spurio venga interpretato inavvertitamente come una richiesta di interruzione: se tale impulso \xc3\xa8, come di solito capita, di breve durata allora esso non viene "sentito". Le interruzioni sul livello, pertanto, sono pi\xc3\xb9 robuste rispetto a quelle sul fronte in presenza di linee rumorose per questa loro capacit\xc3\xa0 di filtrare i segnali spuri._NEWLINE_Ci sono alcuni svantaggi con le interruzioni sul livello. Se la linea \xc3\xa8 condivisa e si sta servendo un dispositivo, non si pu\xc3\xb2 capire se ce n\'\xc3\xa8 un altro che ha poco dopo iniziato a richiedere l\'interruzione: bisogna finire con il primo e comunicargli di smettere di tenere attiva la linea per poi scoprire l\'altro che chiede anch\'esso l\'attenzione. Per questo non \xc3\xa8 consigliabile servire un dispositivo meno prioritario se sulla stessa linea ne \xc3\xa8 presente uno pi\xc3\xb9 prioritario poich\xc3\xa9 si corre il rischio che quest\'ultimo debba aspettare troppo a lungo il completamento della ISR del primo dispositivo ed il secondo dispositivo possa andare in buffer overflow perdendo i dati di input. Un altro inconveniente \xc3\xa8 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.\n_START_SECTION_\nInterruzioni sul fronte\n_START_PARAGRAPH_\nNel 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\xc3\xa9 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\xc3\xa0 quindi la linea bassa o alta (condizione di riposo), senza che, a differenza di prima, gli venga ordinato di farlo: rimarr\xc3\xa0 poi in fiduciosa attesa che venga eseguita la sua ISR._NEWLINE_Anche qui pu\xc3\xb2 ripetersi il discorso dei resistori di pull-down o di pull-up e della linea condivisa da pi\xc3\xb9 dispositivi._NEWLINE_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.\n_START_SECTION_\nVantaggi e svantaggi\n_START_PARAGRAPH_\nUn vantaggio delle interruzioni sul fronte \xc3\xa8 che, mentre si sta servendo un dispositivo, poich\xc3\xa9 la linea \xc3\xa8 stata attivata brevemente ma subito dopo disattivata (\xc3\xa8 quindi "libera"), pu\xc3\xb2 essere sentito un secondo dispositivo che nel frattempo richiede attenzione: ci\xc3\xb2 non \xc3\xa8 possibile con le interruzioni sul livello. Quindi, si pu\xc3\xb2 capire se un dispositivo pi\xc3\xb9 prioritario sta chiedendo un\'interruzione e servirlo, interrompendo il servizio del dispositivo meno prioritario che pure era in corso._NEWLINE_Un altro vantaggio \xc3\xa8 che si pu\xc3\xb2 anche decidere di prendersela comoda a servire un dispositivo meno prioritario, tanto la linea condivisa \xc3\xa8 libera e non si corre il rischio di non sentire l\'interruzione che nel frattempo il dispositivo pi\xc3\xb9 prioritario richiede._NEWLINE_Uno svantaggio delle interruzioni sul fronte \xc3\xa8 che una attivazione della linea potrebbe non essere sentita: mentre con l\'interruzione sul livello ci\xc3\xb2 non pu\xc3\xb2 succedere perch\xc3\xa9 la linea \xc3\xa8 tenuta attiva per tutto il tempo richiesto al completamento della ISR, qui il rischio di perdere un\'attivazione c\'\xc3\xa8 e pu\xc3\xb2 portare a situazioni impreviste. Pu\xc3\xb2 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\xc3\xa9 l\'attivazione della linea non \xc3\xa8 stata sentita.\n_START_SECTION_\nControllori di interruzioni programmabili noti\n_START_PARAGRAPH_\nUno dei PIC pi\xc3\xb9 conosciuti, l\'Intel 8259, era, nei tempi andati, incluso nei PC x86. Oggi, non \xc3\xa8 pi\xc3\xb9 un dispositivo a s\xc3\xa9: la sua funzione \xc3\xa8 stata inclusa all\'interno del chipset Southbridge della  scheda madre. In altri casi, il PIC \xc3\xa8 stato completamente sostituito dai pi\xc3\xb9 nuovi controllori avanzati di interruzioni programmabili, che supportano pi\xc3\xb9 interruzioni e prevedono meccanismi di priorit\xc3\xa0 pi\xc3\xb9 flessibili. _NEWLINE_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.'