Controllore di interruzioni programmabile: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Folto82 (discussione | contributi)
mNessun oggetto della modifica
FrescoBot (discussione | contributi)
m Bot: disambiguazione wikilink e modifiche minori
Riga 5:
 
===Esigenza===
Per 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 [[Hard disk | disco rigido]], un [[floppy disk]], una [[porta seriale]], una [[porta parallela]], la [[Tastiera (informatica)|tastiera]], il [[mouse]], ecc., richiede un servizio in [[RealSistema real-time|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à: 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 è stato ad attivare l'interruzione: tutto questo, ovviamente, gli richiede del tempo tanto più se i candidati sono tanti. La situazione peggiora se più di un dispositivo, "contemporaneamente", richiede l'interruzione: in tal caso il processore deve prevedere un meccanismo di priorità per determinare quale tra più interruzioni pendenti deve servire per primo.
 
===Funzione del PIC===
Riga 11:
 
===Priorità===
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).
 
===Collegamento in cascata===
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 ==
Riga 21:
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.
 
La versione originaria del bus [[Peripheral Component Interconnect|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]].
====Condivisione delle interruzioni====
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.
Riga 39:
 
===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.