|
Appunti informatica |
|
Visite: 1865 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:La macchina di Von NeumannLa macchina di Von Neumann L'evoluzione tecnologica e quella delle architetture Il computerIL COMPUTER ll personal computer (in italiano elaboratore personale), SchedulingScheduling Con Scheduler o Schedulatore si intende generalmente il |
Nelle operazioni di I/O, quando la velocità del trasferimento dei dati assume un valore troppo alto, il metodo delle interruzioni non è più utilizzabile. Infatti, il tempo per lo svolgimento della sequenza d'interruzione e per l'esecuzione della routine, che serve l'interruzione, può essere maggiore di quello disponibile. In questi casi è d'obbligo l'uso di un DMA controller il quale è capace di diventare il padrone del bus e supervisionare un trasferimento tra la memoria ed un'interfaccia periferica o una memoria di massa senza l'intervento del processore.
Mentre esegue un trasferimento, esso è capace di porre indirizzi di memoria sul bus e di spedire e ricevere i segnali necessari per l'effettuazione di operazioni di lettura e scrittura in memoria e sulle interfacce periferiche.
Lo scopo di un DMA controller è quindi quello di realizzare una sequenza di trasferimenti rubando cicli di bus al processore.
E' chiaro che nello sforzo di completare il nostro ambiente di simulazione di architetture a microprocessore, questo tipo di dispositivo non poteva mancare.
Il componente preso di riferimento per questa simulazione è l'Intel 8237.
L'Intel 8237 è un controllore programmabile per l'accesso diretto in memoria (DMA) a 4 canali, dove il canale è una porzione del componente che serve una singola interfaccia; esso gestisce le richieste in arrivo sui vari canali attraverso una logica a priorità fissata o rotante.
Il trasferimento dei dati può avvenire in 4 modi diversi:
nel modo single il controllore dopo ogni trasferimento rilascerà il bus al processore per almeno un ciclo di bus, dopo inizierà di nuovo a testare la linea di richiesta e se attiva, procederà a 'rubare' un altro ciclo;
nel modo block la linea di richiesta è sufficiente che sia attiva solo fino al riconoscimento, dopo il quale il bus non sarà rilasciato fino al trasferimento dell'intero blocco;
il modo demand è simile a quello block con la differenza che il trasferimento del blocco continua fin quando la linea di richiesta è attiva, ma, quando il trasferimento viene sospeso e poi ripreso esso inizia dal punto in cui era stato sospeso;
il modo cascade permette di realizzare, collegando più controllori 8237 in cascata, sistemi DMA con più di 4 canali.
Il blocco di dati che possiamo trasferire in una sola operazione è di 65536 byte; alla fine del trasferimento viene avvisato il processore o la periferica che lo aveva richiesto attraverso una linea di fine conteggio posseduta dal controllore.
Altre caratteristiche del dispositivo sono:
autoinizializzazione,
trasferimenti da memoria a memoria,
richiesta di DMA programmata,
inibizione di un canale.
Fig. 21
La differenza sostanziale, tra l'Intel 8237 e il componente da noi simulato, è il minor numero di canali, che sono stati ridotti da 4 a 2 ed i modi di trasferimento che sono i seguenti: single e block. In Fig. 21 è mostrato il suo modello con i registri e le linee fisiche simulate.
I dispositivi a cui si collega un D.M.A. controller in una configurazione sono:
un processore, che avendo accesso ai registri del dispositivo, attraverso il sistema bus, permette la programmazione del componente;
delle periferiche alle quali vogliamo permettere l'accesso diretto in memoria.
Le linee di collegamento al processore, sono mostrate sulla sinistra dello schema, in Fig. 21.
D0-D7 sono 8 linee che vanno connesse al bus dati per il trasferimento dei dati da e verso il componente.
La linea CS è utilizzata per la selezione del dispositivo, invece, i registri interni sono selezionati dai 4 bit meno significativi del bus indirizzo: A0-A3, e dai segnali di lettura-scrittura sul componente: IOW e IOR.
Come acccennato in precedenza, il controllore per eseguire un trasferimento deve spedire i segnali necessari per l'effettuazione di operazioni di lettura e scrittura in memoria (MEMR e MEMW) e sulle interfacce periferiche (IOR e IOW).
Sulle linee CLK e Reset arrivano rispettivamente il segnale dal generatore di clock e il segnale per cancellare tutti i registri del controllore.
La linea HRQ è adoperata per spedire una richiesta di controllo del sistema bus. Essa normalmente è applicata all'ingresso HOLD della CPU.
Fig. 22
Invece, un segnale, in arrivo dalla CPU, sulla linea HLDA indica che è stato acquisito il sistema bus.
Infine la linea d'interruzione EOP trasmette, al processore o ad un eventuale gestore delle interruzioni, un interruzione per avvisare che il trasferimento di un blocco di memoria è stato completato.
Un esempio di collegamento del controllore ad un processore è mostrato in Fig. 22.
Sulla destra dello schema in fig.1 sono mostrate le linee fisiche che collegano il DMA controller a delle periferiche.
DREQ0 e DREQ1 sono le linee di richieste, usate dalle periferiche collegate ai rispettivi canali, per ottenere dei cicli DMA. Le richieste che arrivano su DREQ0 hanno precedenza su quelle che arrivano su DREQ1.
DACK1 e DACK2 informano la periferica, connessa a quel canale, che è stata selezionata per un ciclo DMA. Queste linee si comportano, nei confronti dei componenti periferici che richiedono questo servizio, come un 'chip select'.
Un esempio di connessione di due interfacce seriali è rappresentato in Fig. 23.
Fig. 23
Per inserire questo componente in una nostra configurazione, bisogna attenersi alla stessa procedura seguita per gli altri componenti di tipo Device. I parametri presenti nella finestra Aggiungi Device mi permettono di gestire la connessione del controllore con gli altri componenti della configurazione. Viene ora specificato il significato dei singoli parametri.
Nome Elemento è utilizzato per specificare il tipo di componente da inserire, nel nostro caso deve essere I8237DMA.
Identificatore deve essere un numero compreso tra 01 ed FF e viene utilizzato dal programma per riferirsi a questo dispositivo.
Indirizzo1 rappresenta l'indirizzo più basso per indirizzare il componente, nel caso del controllore per l'accesso diretto in memoria esso deve essere un numero divisibile per 16.
Indirizzo2 definisce l'indirizzo più alto per indirizzare il componente, esso deve essere uguale ad Indirizzo 1 + F.
Questi ultimi due parametri permettono di definire per quali indirizzi il decodificatore d'indirizzi attiva la linea CS. Infatti, se l'indirizzo sul bus indirizzo è compreso tra Indirizzo1 e Indirizzo2 , il componente viene selezionato, cioè l'operazione di lettura o scrittura è eseguita su un suo registro.
COM1 determina l'Identificatore del bus a cui è connesso il dispositivo. Quindi, scegliendo per COM1 l'identificatore di un componente MMU/BUS si connettono le linee D0-D7, A0-A7, IOR, IOW, MEMR, MEMW, CLK e Reset del DMA a quel sistema bus.
COM2 definisce l'Identificatore della CPU alla quale richiedere il controllo del bus e quindi a quale processore collegare le linee HRQ e HLDA.
COM4: specifica l'Identificatore del gestore delle interruzioni che può essere sia un componente di tipo CPU che di tipo PIC.
COM3: viene utilizzato per specificare l'interruzione trasmessa al componente, specificato in COM4, quando termina un conteggio in un canale. Delle quattro cifre esadecimali, che definiscono COM3 la meno significativa individua la linea d'interruzione, la seconda definisce la priorità e le due più significative specificano il 'vector number' da trasmettere al processore che gestisce l'interruzione. Se le interruzioni sono gestite da un PIC, queste due cifre non devono essere specificate.
I due parametri COM3 e COM4 permettono, quindi, di gestire la connessione della linea d'interruzioni EOP al processore o al PIC
COM5 le 2 cifre meno significative e le 2 più significative specificano rispettivamente l'Identificatore del componente collegato al canale 0 e al canale 1.
Specificando il valore in COM5 si definisce a quali componenti collegare le coppie di linee (DREQ0, DACK0) e (DREQ1, DACK1).
La finestra di programmazione associata al modulo I8237DMA ed i registri programmabili del controllore sono riportati in Fig. 24.
Fig. 24
Per accedere ad un registro occorre che esso sia compreso tra i valori Indirizzo1 ed Indirizzo2 (valori inseriti prima della creazione del dispositivo). La selezione dei registri nel DMA controller avviene attraverso i 4 bit meno significativi dell'indirizzo; questi formano l'indirizzo relativo con valore che va da 0 ad F esadecimale.
Nel nostro dispositivo ai registri appartenenti al canale 0 è stato dato un nome terminante con '0' mentre a quelli appartenenti al canale 1 un nome terminante con '1'.
Iniziamo questa descrizione dai registri CADDR0 e CADDR1 cioè dai registri indirizzo corrente. Essi sono dei registri a 16 bit che hanno il compito di contenere l'indirizzo della prossima locazione di memoria che deve partecipare al trasferimento. Nel caso del trasferimento da memoria a memoria CADDR0 contiene l'indirizzo sorgente e CADDR1 l'indirizzo destinazione. In ogni caso entrambi i registri sono accessibili sia in lettura che in scrittura ed il loro indirizzo relativo è 0 per CADDR0 ed è 2 per CADDR1.
BADDR0 e BADDR1 sono i registri indirizzo di base ed hanno la funzione di conservare gli indirizzi iniziali rispettivamente di CADDR0 e CADDR1. Essi sono a 16 bit e sono accessibili solo in fase di scrittura; infatti, quando viene scritto un valore in un registro indirizzo corrente, questo vien copiato anche nel relativo registro di base ed il valore rimane immutato fino a quando non si verifica un'altra scrittura.
I registri CCOUNT0 e CCOUNT1, detti registri di conteggio correnti, sono anch'essi dei registri a 16 bit e mantengono il numero di byte che devono essere ancora trasferiti, sono accessibili in lettura e scrittura ed il loro indirizzo relativo è 1 per CCOUNT0 e 3 per CCOUNT1.Nel caso di trasferimento da memoria a memoria il conteggio viene effettuato da CCOUNT1.
BCOUNT0 e BCOUNT1 sono i registri a 16 bit detti di conteggio di base ed hanno la funzione di conservare gli indirizzi iniziali rispettivamente di CCOUNT0 e CCOUNT1, essi sono accessibili solo in fase di scrittura. Infatti, quando viene scritto un valore in un registro di conteggio corrente questo viene copiato anche nel relativo registro di base ed il valore rimane immutato fino a quando non si verifica un'altra scrittura.
I registri, che contengono le informazioni relative al modo
di funzionamento dei rispettivi canali, sono stati chiamati MODE0 e MODE1. Essi possono essere accessi solo in scrittura ed hanno entrambi indirizzo relativo pari a
B; la selezione tra i due avviene sul valore del bit meno significativo del
dato: se 0, il dato viene scritto in MODE0
altrimenti in MODE1. Il significato
dei bit dei registri MODE0 ed MODE1 sono illustrati nella Errore.
L'origine riferimento non è stata trovata.
Tabella 8-Significato dei bit nei registri MODE
RF0 e RF1 rappresentano i flag delle richieste, cioè i flag dove indirizzare richieste di tipo software al DMA, queste producono gli stessi effetti di quelle provenienti dalle interfacce dei dispositivi. Questi flag sono accessibili solo in scrittura e l'indirizzo relativo per entrambi è 9. Anche in questo caso la selezione del canale avviene sul bit meno significativo del dato: 0 per il canale 0 ed 1 per il canale 1. Il valore che deve assumere il flag deve essere posto sul bit numero 3 del dato.
Alri flag presenti nel nostro componente sono MF0 e MF1. Questi mascherano le richieste dei rispettivi canali, cioè una richiesta non viene inoltrata al processore se il mask flag di quel canale è posto ad 1. MF0 ed MF1 sono accessibili solo in scrittura, per entrambi l'indirizzo relativo è A, il canale selezionato è pari al valore del bit 0 del dato ed infine il valore da inserire nel flag deve esssere posto sul bit 2 del dato.
Tabella
9-Significato dei bit
di CNTRL
In un trasferimento da memoria a memoria il byte da spostare viene letto dalla locazione sorgente e spostato in un registro temporaneo, che è stato chiamato TEMP, a questo punto viene realizzata una scrittura col valore di TEMP nella locazione di memoria di destinazione. Questo registro può essere solo letto ed ha indirizzo relativo pari a D.
L'ultimo registro da descrivere è CNTRL; esso è diviso in 2 parti: i 4 bit meno significativi rappresentano i bit di stato del componente, mentre quelli più significativi i bit di controllo. Su questo registro possono essere fatti accessi, all'indirizzo relativo 8, sia in lettura che in scrittura, queste ultime però non influenzano i 4 bit di stato. Il significato dei bit di CNTRL é specificato in Tabella 9.
Un quadro riassuntivo sull'indirizzamento dei registri e dei
flag del componente è riportato in Tabella
10.
I comandi disponibili sono:
RESET che riporta il componente nello stato iniziale azzerando tutti i registri; per attivarlo basta accedere in scrittura all'indirizzo relativo D;
Clear Mask Flag (CMF) che cancella tutti i flag MF, si attiva scrivendo all'indirizzo relativo E;
Write All Mask Flag (WAMF)
che permette di fissare contemporaneamente tutti i flag MF; la scrittura deve avvenire all'indirizzo relativo F ed il
valore di MF0 deve essere posto nel
bit 0 del dato, mentre il valore di MF1
nel bit 1.
Tabella 11-Indirizzi dei comandi del DMA controller
In Tabella 11 sono presentati gli indirizzi di attivazione dei comandi.
Prima che sia effettuata la richiesta di un trasferimento dati tra la memoria ed una interfaccia periferica si devono fissare i valori nei registri del canale interessato al trasferimento e nel registro di controllo.
Nell'ipotesi che il canale adoperato sia quello '0', le operazioni da eseguire sono le seguenti:
scrivere all'indirizzo relativo 0 (registro CADDR0) una word indicante l'indirizzo del primo byte, del blocco in memoria, da trasferire;
scrivere all'indirizzo relativo 1 (registro CCOUNT0) una word indicante il numero di byte che si vuole trasferire;
scrivere all'indirizzo relativo B esadecimale (registro MODE0) un byte che indichi il modo di funzionare del canale (direzione del trasferimento, autoinizializzazione, incremento o decremento di CADDR0, modo del trasferimento Single o Block);
scrivere all'indirizzo relativo 8 (registro CNTRL) un byte che abiliti il controllore.
Un primo esempio di inizializzazione è di seguito illustrato. In esso si presuppone che A0 sia stato precedentemente caricato con l'indirizzo più basso associato al DMA controller.
Queste istruzioni abilitano il controllore a realizzare un trasferimento di tipo SINGLE dalla memoria all'interfaccia collegata al canale 0. Il numero di byte da trasferire è 32 (20 esad.), gli indirizzi sono quelli crescenti da 1000 esad. in poi. Infine è stata abilitata l'autoinizializzazione, che permette di ricaricare, al termine del trasferimento, i registri CADDR0 e CCOUNT0 con i rispettivi registri di base, rendendo così il componente pronto ad eseguire un nuovo trasferimento.
MOVE.W #$1000,0(A0)
MOVE.B #$20,1(A0)
MOVE.B #$10,11(A0)
MOVE.B #$80,8(A0)
Il trasferimento inizia, comunque, quando la periferica collegata al canale '0'spedisce una richiesta al DMA e quest'ultimo l'accetta. La richiesta potrebbe anche realizzarsi via software con la seguente istruzione:
MOVE.B #$08,9(A0)
Per un trasferimento di un blocco di byte all'interno della memoria le operazioni da eseguire sono le seguenti:
scrivere all'indirizzo relativo 0 (registro CADDR0) e 2 (registro CADDR1) due word indicanti gli indirizzi del primo byte, del blocco in memoria, rispettivamente sorgente e destinazione;
scrivere all'indirizzo relativo 3 (registro CCOUNT1) una word indicante il numero di byte che si vuole trasferire;
scrivere due volte all'indirizzo relativo B esadecimale (registri MODE0 e MODE1) un byte che indichi il modo di funzionare del canale 0 (sorgente) e del canale 1 (destinazione) per quanto riguarda l'autoinizializzazione e l'incremento o il decremento di CADDR0 e CADDR1);
scrivere all'indirizzo relativo 8 (registro CNTRL) un byte che abiliti il controllore ed il trasferimento da memoria a memoria.
Un esempio di inizializzazione su questo tipo trasferimento è riportato di seguito; anche in questo esempio in A0 è presente l'indirizzo più basso associato al DMA controller.
Queste istruzioni abilitano il controllore a realizzare un trasferimento in memoria di un blocco di 64 byte (40 esad.) a partire dall'indirizzo (sorgente) 1000 esad. in poi. Esso deve essere trasferito nella zona di memoria successiva all'indirizzo 2000 esad. (destinazione). Infine è stata disabilitata l'autoinizializzazione sia per il canale sorgente che per quello destinazione.
MOVE.W #$1000,0(A0)
MOVE.W #$2000,2(A0)
MOVE.B #$40,3(A0)
MOVE.B #$00,11(A0)
MOVE.B #$01,11(A0)
MOVE.B #$A0,8(A0)
Un DMA controller è progettato per servire una o più interfacce, nel nostro caso le interfacce collegabili sono massimo 2. Questa scelta è dettata dall'esiguo numero di parametri che definiscono un Chip in ASIM. Una convenzione stabilita per le periferiche che si collegano a un canale di questo dispositivo è che i dati sono trasferiti riferendosi al suo indirizzo più basso, cioè al valore del parametro Indirizzo 1 di quella periferica.
Il controllore quando richiede il bus ad un processore blocca le operazioni di quest'ultimo fino al momento del rilascio il bus.
In questa descrizione, quando ci riferiremo ad un registro senza indicare il numero finale del suo nome, s'intenderà il registro relativo al canale sul quale si sta realizzando il trasferimento.
Quando un device collegato ad un canale del D.M.A. manda una richiesta, e il flag MF di quel canale è uguale a zero, viene settato il bit corrispondente in CNTRL: il bit 2, se la richiesta è pervenuta sul canale 0, o il bit 3, se la richiesta sopraggiunge sul canale 1. Se poi il bit 7 del registro CNTRL (che abilita il dispositivo) è uguale a uno, il dispositivo spedisce al processore una richiesta di bus il quale nel nostro caso viene automaticamente concesso.
La direzione del trasferimento dipende dal valore del bit 3 del registro MODE di quel canale, se pari a zero, il trasferimento si realizza dalla memoria al device, altrimenti avviene nella direzione opposta. Se, invece, il bit 5 di CNTRL è uguale ad 1, il trasferimento si verifica da memoria a memoria.
Una volta impossessatosi del bus il controllore effettua, per un trasferimento da Device a memoria, una lettura all'indirizzo più basso associato al device e una scrittura del dato letto all'indirizzo di memoria presente nel registro CADDR di quel canale, ovviamente, nel caso di trasferimento da memoria a device, le operazioni sono invertite.
Comunque in entrambi i casi viene decrementato di una unità il registro CCOUNT del relativo canale mentre il registro CADDR viene incrementato o decrementato di una unità rispettivamente, se il bit 5 del registro MODE è pari a zero o ad uno.
Il bus viene rilasciato al processore dopo il trasferimento del singolo byte o dell'intero blocco se rispettivamente il valore del bit 7 di MODE è zero o uno.
Al termine del trasferimento di un blocco, cioè quando il valore CCOUNT diventa nullo,
viene cancellato il flag RF (è il flag dove un processore può indirizzare le sue richieste ed hanno gli stessi effetti di quelle che arrivano dai device),
è azzerato il bit 2 o 3 di CNTRL (bit delle richieste) se abbiamo utilizzato rispettivamente il canale zero o uno,
è posto ad uno il bit 0 o 1 di CNTRL (bit di fine conteggio) rispettivamente per il canale zero e uno,
infine viene inviata un'interruzione del tipo specificato in COM3 al gestore delle interruzioni specificato in COM4.
Per un trasferimento da memoria a memoria viene effettuata, prima una operazione di lettura all'indirizzo contenuto in CADDR0 ed il dato viene posto nel registro TEMP, poi questo valore viene scritto all'indirizzo di memoria contenuto in CADDR1.
Dopo un trasferimento il registro CCOUNT1 viene decrementato di una unità mentre CADDR0 e CADDR1 vengono incrementati o decrementati di una unità, se il bit 5 dei rispettivi registri MODE è pari a zero o ad uno. Se però il bit 6 di CNTRL è posto ad 1 allora CADDR0 rimane costante durante il trasferimento.
Il bus viene rilasciato al processore dopo il trasferimento dell'intero blocco, cioè quando il valore in CCOUNT1 diventa nullo. Alla fine del trasferimento viene azzerato il bit 5 di CNTRL, il quale attiva i trasferimenti da memoria a memoria.
Qualunque sia il tipo di trasferimento, se il bit 4 di un registro MODE è fissato ad 1, allora al termine del trasferimento di un blocco i registri CADDR e CCOUNT di quel canale sono caricati con i valori rispettivamente di BADDR e BCOUNT; questi registri in fase di scrittura di CADDR e CCOUNT assumono il loro stesso valore.
Appunti su: controller dma nei computer, |
|