Colloquio I/O

Materie:Appunti
Categoria:Informatica
Download:87
Data:03.11.2000
Numero di pagine:10
Formato di file:.doc (Microsoft Word)
Download   Anteprima
colloquio_1.zip (Dimensione: 21.62 Kb)
trucheck.it_colloquio-i-o.doc     75.5 Kb
readme.txt     59 Bytes



Testo

Arbitraggio dei colloqui
Se analizziamo uno scambio di dati tra più di due elementi (sia nel caso del microprocessore collegato alle varie periferiche che in quello del computer centrale collegato ad un certo numero di terminali) occorre prevedere nel Protocollo ulteriori regole per distinguere il sistema cui si è collegati.
Due sono i metodi utilizzati per coordinare il trasferimento dei dati:
• colloquio sotto il controllo dell'unità centrale (o Polling);
• colloquio su richiesta della periferica (o Interrupt).
Chiameremo Master l'unità principale che detiene il controllo del protocollo e Slave i generici elementi collegati.
Polling
Il Master interroga ciclicamente tutti gli Slave, esaminando per ciascuno un opportuno registro di stato, in modo da individuare chi è disponibile al colloquio (in input o in output):
• Se la periferica non è pronta, l'esame passa allo Slave successivo.
• Se la periferica è pronta viene effettuato lo scambio dei dati e, al termine, il master riprende l'esame ciclico.
Con questo metodo, detto Polling, l'unità centrale ha il controllo completo dello stato d'avanzamento dei processi, decide di volta, in volta se una periferica deve essere interpellata o no, decide l'ordine di Priorità che può anche cambiare durante il lavoro. Altro vantaggio è la relativa semplicità circuitale e del software di gestione.
Per contro il Master spreca buona parte del suo tempo in interrogazioni spesso inutili degli altri dispositivi. Inoltre, una periferica che si renda disponibile al colloquio subito dopo un'interrogazione con esito negativo, dovrà attendere tutto il ciclo di Polling prima di essere nuovamente interpellata con probabile perdita di dati (ad esempio il registro Rx Hold dell'RS232 che rischia d'essere soprascritto dal prossimo carattere in arrivo sul registro Rx Shift).
Interrupt
Quando il Polling non è utilizzabile per ragioni d'efficienza, viene adottata la tecnica dell'Interruzione di Programma (Interrupt): in questo caso lo Slave che ha necessità di un colloquio (o che si è reso disponibile dopo una precedente richiesta del Master) invia all'unità centrale un segnale di richiesta su un apposito canale.
Più in generale per "Interrupt" si intende il verificarsi di un evento esterno che alteri l'esecuzione di un programma.
1. Il master può decidere se ascoltare o no il segnale d'interrupt (mascheramento) che, in ogni modo, non può interrompere un'istruzione macchina in corso.
2. Ricevuta la richiesta il master salva sullo Stack le informazioni relative al programma in corso (Program counter, Flags, registri dati).
3. Viene quindi attivata la procedura di riconoscimento della periferica che ha chiesto il servizio.
4. In base al tipo di slave viene eseguita una subroutine specifica per trasferire i dati da o verso la periferica.
5. Al termine del colloquio il master riprende dallo stack i valori parcheggiati e prosegue il programma interrotto.
Con questo tipo di gestione il master può eseguire altri programmi durante le fasi in cui le periferiche sono inattive, intervenendo solo quando è necessario eseguire il trasferimento dei dati. Per contro viene richiesta una maggiore complessità circuitale e, soprattutto, software, per risolvere una serie di problemi aggiuntivi:
• Riconoscimento della periferica che inoltrato il segnale di interrupt (escludendo che le richieste pervengano su fili separati per ciascuna periferica) e attivazione della subroutine di servizio relativa.
• In caso di contemporaneità di richiesta occorre scegliere quale slave servire per primo assegnando dei livelli di priorità.
• Per evitare la nidificazione delle chiamate occorre disabilitare il segnale di interrupt durante l'esecuzione della subroutine di servizio.
• Potrebbe essere necessario, durante il lavoro, abilitare selettivamente solo alcune periferiche ed altre no.
Riconoscimento con ciclo di verifica periferiche
La soluzione più semplice consiste nell'attivare, dopo la segnalazione di interrupt, un ciclo di interrogazioni analogo al Polling.
Il master cerca la periferica disponibile al colloquio nell'ordine che ritiene più valido al momento, scavalcando quelle che desidera disabilitare. In caso di verifica positiva viene invocata la subroutine corrispondente e, se il programma lo prevede, il piedino di interrupt viene temporaneamente disabilitato fino al termine del colloquio.
Lo svantaggio di questo sistema è la relativa lentezza da parte dell'unità centrale ad attivare il colloquio.
Daisy chain
Si tratta di una soluzione hardware che permette di abilitare solo una delle periferiche che chiedono il colloquio, secondo una priorità prefissata:
1. tutte le periferiche sono collegate con un unico canale al piedino di interrupt (INTREQ) del master;
2. quando riceve una richiesta, il master invia un segnale di abilitazione INTACK (Interrupt Ackonowledge);
3. il segnale di INTACK attraversa in serie una cascata di dispositivi elementari, uno per periferica: ciascuno di questi circuiti lascia passare l'abilitazione se la periferica collegata non ha chiesto il servizio, mentre blocca il segnale abilitando la propria periferica se questa aveva generato il segnale di interrupt;
4. la periferica abilitata trasmette sul bus dati il proprio codice di riconoscimento;
5. l'unità centrale in base a questo codice cerca in un elenco l'indirizzo della subroutine di servizio e la esegue.
La tecnica daisy chain permette una gestione semplice ed economica del colloquio in interrupt, con la possibilità di aggiungere altre periferiche alla catena fino al numero massimo consentito dal codice di riconoscimento.
D'altro canto le priorità degli slave sono legate alla collocazione hardware e quindi non sono modificabili (il circuito più vicino al master ha sempre la precedenza); inoltre non è possibile disabilitare selettivamente solo alcune periferiche.
Controllore di interrupt esterno
Il metodo più versatile per arbitrare le richieste di interrupt è quello di affidare il lavoro ad un dispositivo esterno dedicato.
Nel caso del PC viene usato il controllore PIC 8259 (Programmable Interrupt Controller) che gestisce 8 linee di Interrupt separate; il PIC può essere istruito dal microprocessore in base alle varie esigenze:
• ad ogni periferica viene assegnato un codice differente;
• viene fissato un ordine di priorità degli otto dispositivi collegati;
• il master può chiedere di abilitare selettivamente solo alcune linee;
• quando il PIC riceve una segnalazione trasmette sul Bus Dati il codice corrispondente alla periferica;
• quando due o più periferiche chiedono di essere servite, il PIC provvede a selezionare quella con priorità più alta;
• solo quando il microprocessore, terminato il servizio della periferica, comunica la fine dell’interruzione, il PIC abilita ulteriori richieste.
La gestione degli INTERRUPT nel PC
I processori a 16 bit dell’INTEL prevedono una gestione vettorizzata delle interruzioni: in corrispondenza del segnale INTA, il processore legge il byte basso del bus dati e utilizza il valore letto come puntatore alla tabella di 256 indirizzi di 4 byte ciascuna, posta nella RAM da 00000h a 003FFh.
Ad ogni Interrupt corrisponde l’indirizzo di una Subroutine di gestione (sempre di tipo FAR indipendentemente dal modello di memoria utilizzato dal programma principale); la sequenza delle operazioni eseguite dal eP è:
1. Termina l’istruzione in corso.
2. Salva i registri CS, IP e Flag nello Stack.
3. Acquisisce dal PIC il codice della periferica che ha chiesto l'interrupt.
4. Legge dalla tabella degli Interrupt i nuovi valori per IP e CS.
5. Esegue la routine di colloquio con la periferica o di gestione dell’evento.
6. In uscita dalla Subroutine, con l’istruzione IRET vengono recuperati i Flag e i vecchi valori di IP e CS.
La stessa procedura viene seguita sia per gli Interrupt Hardware (corrispondenti alla richiesta da una periferica) che per gli Interrupt Software (invocato da programma con l’istruzione INT xx )
INT
CS:IP in Tabella a
Evento concomitante o Funzione Svolta dalla Subroutine
00h
03h - 00h
Divisione per 0
01h
07h - 04h
Esecuzione passo-passo del programma
02h
0Bh - 08h
NMI ( Interrupt Non Mascherabile )
03h
0Fh - 0Ch
Breakpoint
04h
13h - 10h
Overflow
05h
17h - 14h
Print Screen
08h
23h - 20h
System Timer IRQ0
09h
27h - 24h
Lettura tastiera e inserimento nel buffer : IRQ1
0Bh
2Fh - 2Ch
Colloquio con COM2 : IRQ3
0Ch
33h - 30h
Colloquio con COM1 : IRQ4
0Dh
37h - 34h
IRQ5
0Eh
3Bh - 38h
Controller Floppy disk: IRQ6
0Fh
3Fh - 3Ch
Colloquio con LPT1 : IRQ7
10h
43h - 40h
Gestione del video
14h
53h - 50h
Gestione della comunicazione seriale
16h
5Bh - 58h
Gestione della tastiera
1Ch
70h - 73h
Richiamato dalla sub di INT 8: a disposizione dell'utente
33h
CFh - CCh
Gestione del Mouse
70h
1C3h - 1C0h
Real Time Clock: IRQ8
76h
1DBh - 1D8h
Controller Hard disk: IRQ14
Per collegare più periferiche alla linea INT del microprocessore viene usato il controllore 8259 (Programmable Interrupt Controller) che gestisce 8 linee di Interrupt anche in termini di priorità: quando due o più periferiche chiedono contemporaneamente di essere servite, il PIC provvede a selezionare quella con priorità più alta ed a trasmettere sul Bus Dati un codice corrispondente. Quando il microprocessore termina il servizio della periferica, comunica al PIC la fine dell’interruzione (EOI) in modo da poter abilitare ulteriori Interrupt.
Nei PC di tipo AT e successivi sono presenti 2 PIC (definiti PIC#1 e PIC#2), collegati in cascata ed allocati agli indirizzi 20h-21h e A0h-A1h rispettivamente:
Nella fase di Bootstrap il BIOS provvede a programmare PIC#1 e PIC#2 trasmettendo gli opportuni parametri ai registri 20h-21h e A0h-A1h (priorità delle interruzioni, associazione tra IRQx e Vettore Interrupt, ecc... ).
Gli Interrupt così collegati al piedino INTR del microprocessore possono essere abilitati o disabilitati in blocco agendo sul flag di Interrupt con le istruzioni assembler STI e CLI (gli Interrupt software NON sono mascherabili).
I singoli IRQ possono poi essere abilitati o disabilitati mascherando ciascun bit del registro di indirizzo dispari del PIC (ogni bit corrisponde ad un IRQ) tenendo presente che 0 equivale all’abilitazione mentre 1 equivale alla disabilitazione dell’Interrupt.
Ad esempio, per abilitare la seriale COM2 occorre:
IN AL , 21h
AND AL, 11110111b
OUT 21h, AL
Per resettare la richiesta in corso, al termine della routine di Interrupt,
bisogna inviare il valore 20h all’indirizzo pari del PIC interessato.
MOV AL , 20h
OUT 20h, AL
La gestione del Timer
Nel PC è installato il timer PIT 8253/8254 (Programmable Interval Timer) che si occupa di scandire il tempo per i dispositivi interni.
Il PIT è mappato in isolated I/O agli indirizzi 040h ÷ 043h e riceve in input il segnale prodotto da un clock base di 1193180 Hz; la frequenza in output è ottenuta decrementando un registro interno a 16 bit, a partire ogni volta da un valore fissato programmabile, e generando un segnale alto in output ogni volta che il registro si azzera.
In pratica assegnando al registro un valore 1 si ottiene in output la stessa frequenza del segnale di ingresso, assegnando 2 si ottiene una frequenza dimezzata (un periodo raddoppiato) e così via.
La minima frequenza è ottenibile assegnando 0 come valore iniziale, in quanto il segnale di out verrà generato ogni 65536 decrementi del registro base.
Registro di Controllo
Il PIT 8253/8254 può essere programmato scrivendo un byte di controllo nell'indirizzo I/O 043h (registro a sola scrittura) e quindi uno o due byte nei registri dei singoli contatori (lettura/scrittura).
L'accesso ai registri dei singoli contatori è sempre 8 bit alla volta.
bit
7
6
5
4
3
2
1

043h 0

select counter:
00 = counter 0
01 = counter 1
10 = counter 2
read /write
successiva operazione di lettura o scrittura sui registri contatori:
01 = solo byte basso
10 = solo byte alto
11 = prima byte basso e dopo byte alto
mode
modalità operativa del PIT,
valori da 000 a 101.
BCD
0 = conteggio a 16 bit da 0h a FFFFh
1 = conteggio BCDdecimale da 0 a 9999
Contatore 0
Il valore di partenza del contatore è 0 (ovvero 65536): la frequenza di Out è 1193180 / 65536 = 18.206 Hz.
Il segnale Out 0 è collegato a IRQ 0 del PIC: circa 18 volte al secondo il IP interrompe il lavoro e incrementa la longword 046Ch in memoria, che è stata inizializzata all'atto del bootstrap con il numero dei clock trascorsi dalla mezzanotte precedente (l'orologio di sistema è in funzione anche a PC spento);
quando sono raggiunte le 24:00 ( » 157300 impulsi ) viene incrementato il byte 0470h.
Contatore 1
Il contatore 1 opera con un valore 18, quindi genera una frequenza pari a 66288 Hz: questo segnale viene utilizzato per il refresh delle memorie dinamiche DRAM.
Contatore 2
Il contatore due è utilizzato per generare la frequenza di funzionamento dell'altoparlante interno (Speaker).
Per programmare il contatore 2 occorre attivare la modalità 3 del PIT con conteggio binario:
mov al, 10110110b contatore 2, byte basso e poi byte alto, modo 3, binario
out 43h, al
mov al, low-count
out 42h, al
mov al, high-count
out 42h, al
La gestione dello Speaker
La scala delle note musicali (basata su 440 Hz = LA, e con un Fattore moltiplicativo per un semitono = 1,0594631 pari alla radice 12° di 2 ) viene riprodotta dividendo il Clock base del PC = 1193180 Hz per la frequenza, ed assegnando il divisore al registro 0x42 del counter 0 del Timer, collegato allo speaker.
Ad esempio il LA = 440 Hz viene ottenuto con un divisore = 2712.

Scala delle note musicali: Clock base del PC = 1193180 / frequenza nota
Fattore moltiplicativo per un semitono = 1,0594631
divisore nota frequenza
divisore nota frequenza
10847 LA 110
10238 LA# 117
9664 SI 123
9121 DO 131
8609 DO# 139
8126 RE 147
7670 RE# 156
7240 MI 165
6833 FA 175
6450 FA# 185
6088 SOL 196
5746 SOL# 208
5424 LA 220
5119 LA# 233
4832 SI 247
4561 DO 262
4305 DO# 277
4063 RE 294
3835 RE# 311
3620 MI 330
3417 FA 349
3225 FA# 370
3044 SOL 392
2873 SOL# 415
2712 LA 440
2712 LA 440
2560 LA# 466
2416 SI 494
2280 DO 523
2152 DO# 554
2032 RE 587
1918 RE# 622
1810 MI 659
1708 FA 698
1612 FA# 740
1522 SOL 784
1437 SOL# 831
1356 LA 880
1280 LA# 932
1208 SI 988
1140 DO 1047
1076 DO# 1109
1016 RE 1175
959 RE# 1245
905 MI 1319
854 FA 1397
806 FA# 1480
761 SOL 1568
718 SOL# 1661
678 LA 1760
La durata della nota viene ottenuta attivando e disattivando il registro 0x61 che funge da Gate per l'amplificatore.
Il filtro Passa-basso esclude frequenze dannose per l'altoparlante.
Attivazione
in al, 61h
or al, 3
out 61h, al
Disattivazione
in al, 61h
and al, 11111100b
out 61h, al
Dispense a cura di Ciardi Ciro - a.s.2000-2001

1

Esempio