Controllore di interruzioni programmabile: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Zetazeti (discussione | contributi)
Riga 16:
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 asul '''[[livello (level-triggered)]]''' sia del tipo sul '''fronte ([[Edge triggered|Edge-triggered)]]'''.
 
===Interruzioni sul livello===
Nel primo caso, il segnale di interruzione proveniente da un dispositivo interrompente e che va 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 viene detto a quest'ultimo che può riabbassarlo nuovamente.
 
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.
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, ad esempio, da basso ad alto e quindi il dispositivo interrompente può riportarlo basso, senza che, a differenza di prima, gli venga ordinato di farlo, tanto il fronte stesso è stato già sentito dal PIC.
 
Un '''vantaggio''' di un tale tipo di approccio è il 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 qulle 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, rispettivamente, 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 attivare 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 un dispositivo interrompente, quest'ultimo potrebbe tenere '''indefinitamente attiva la linea''' impedendo agli altri di segnalare la propria richiesta di interruzione.
 
La versione originale 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 secondo 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é illo segnalestesso venga automaticamente sentito dal PIC: quest'ultimoviene infatti sentesentito il '''fronte''' rispettivamente di salita o di discesa del segnale, ossia chela essotransizione sida èun portato,livello ad esempio,un daaltro. bassoIl addispositivo altointerrompente eriporterà quindi illa dispositivolinea interrompentebassa puòo riportarloalta basso(condizione di riposo), senza che, a differenza di prima, gli venga ordinato di farlo,: tantorimarrà ilpoi frontein stesso'''fiduciosa èattesa''' statoche giàvenga sentitoeseguita la dalsua PICISR.
 
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 era 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 che ha richiesto 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.
 
== Controllori di Interruzioni Programmabili noti ==