|
Appunti informatica |
|
Visite: 1662 | Gradito: | [ Medio appunti ] |
Leggi anche appunti:Funzione erroriFUNZIONE ERRORI Scopo: la function calcola l'errore relativo e l'errore Il dispositivo priority interrupt controllerIl dispositivo PRIORITY INTERRUPT CONTROLLER I campi relativi alla configurazione Federico FagginFederico Faggin E' conosciuto in tutto il mondo per quella sua intuizione che |
I campi relativi alla configurazione del dispositivo sono così codificati:
Name I8259PIC
Type Identificatore assoluto nella configurazione;
Address1 Indirizzo base pari per il dispositivo
Address2 Indirizzo base+$13
BUS Ident. del bus a cui il dispositivo èconnesso
COM1 Ident. del dispositivo PIC o CPU associato alla linea 1
COM2 Ident. del dispositivo PIC o CPU associato alla linea 2
COM3 Ident. del dispositivo PIC o CPU associato alla linea 3
COM4 Ident. del dispositivo PIC o CPU associato alla linea 4
Tabella 5
Il componente industriale di riferimento per questa dispositivo è l'Intel 8259A.
L'Intel 8259A è stato progettato per minimizzare il software e il sovraccarico nella gestione di interruzioni con livelli di priorità multipli. Questo PIC gestisce fino ad 8 livelli di priorità, ma utilizzando più PIC in cascata è possibile arrivare a gestire fino a 64 livelli senza l'aggiunta di un'ulteriore circuiteria esterna.
Esso ha molti modi per gestire le interruzioni, permettendo
l'ottimizzazione di una varietà di esigenze dei sistemi.
Fig. 17- modello di programmazione del PIC
Questi modi possono essere cambiati o riconfigurati in ogni istante durante l'esecuzione di un programma.
Il componente da noi simulato in realtà ha un numero di registri e di modi di funzionamento inferiore rispetto a quello reale. In Fig. 17- modello di programmazione del PIC è mostrato il suo modello con i registri e le linee fisiche simulate.
I dispositivi a cui si collega il controllore delle interruzioni in una configurazione sono:
un processore, che avendo accesso ai registri del dispositivo, attraverso il sistema bus, permette la programmazione del componente;
dei device di cui si vogliono gestire le interruzioni inviate;
un eventuale PIC(o lo stesso processore) per gestire l'interruzione inviata dal dispositivo.
Le linee che collegano il gestore delle interruzioni al processore sono mostrate sulla sinistra dello schema in Fig. 17.
Anche in questo caso il bus dati è utilizzato dal processore 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 dal bit meno significativo del bus indirizzo: A0, dai segnali di lettura-scrittura: RD e WR, oltre che dallo stato interno.
Infine la linea d'interruzione INT trasmette al processore o all'eventuale PIC la richiesta d'interruzione selezionata dal dispositivo, tra quelle presenti in ingresso.
Un esempio di collegamento del controllore programmabile delle interruzioni al processore è mostrato in Fig. 18, dove sono presentate, del Motorola 68000, solo le linee coinvolte nel collegamento.
Fig. 18-Collegamento del PIC al processore MC68000
Sulla destra dello schema in Fig. 18 sono mostrate le linee che collegano il PIC ad un device.
Nel caso del componente in esame il collegamento ad un device è semplice, infatti, basta collegare la linea per l'invio delle interruzioni del device ad una delle 8 linee di richiesta delle interruzioni. Queste linee hanno priorità decrescenti da IR0 aIR7.
Per inserire questo componente in una configurazione di sistema, bisogna attenersi alla stessa procedura seguita per gli altri componenti di tipo Device.
I parametri presenti nella finestra Aggiungi Device permettono di gestire la connessione del gestore programmabile delle interruzioni con gli altri componenti della configurazione.
Nome Elemento è utilizzato per specificare il tipo di componente da inserire, nel caso in esame deve essere 'I8259PIC'.
Identificatore deve essere un numero compreso tra 01 ed FF e viene utilizzato dal programma per riferirsi a questo dispositivo.
Indirizzo 1 rappresenta l'indirizzo più basso per accedere al componente; in questo caso deve essere un numero pari.
Indirizzo 2 definisce l'indirizzo più alto per indirizzare il componente, nel caso in esame deve essere uguale ad Indirizzo1 + 1.
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 è Indirizzo1 o Indirizzo2 , il componente viene selezionato, cioè l'operazione di lettura o scrittura è eseguita su un suo registro.
BUS determina l'Identificatore del bus a cui è connesso il dispositivo. La connessione delle linee bus dati, A0 e RD e WR del controllore delle interruzioni al processore è realizzata, nel nostro simulatore, scegliendo per BUS l'identificatore di un componente MMU/BUS, a cui è stato collegato il dispositivo di tipo CPU.
COM1 definisce l'Identificatore del gestore delle interruzioni, cioè il componente (di tipo processore o PIC) al quale trasmettere le interruzioni non mascherate.
COM2 viene utilizzato per specificare l'interruzione trasmessa alla componente specificato in COM2. 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'. Se le interruzioni sono gestite da un PIC il vector number non deve essere spedito e quindi le ultime due cifre non devono essere specificate.
Gli ultimi due parametri permettono di realizzare, nell'ambiente di simulazione, il collegamento tra la linea INT del dispositivo ed il processore o un ulteriore PIC
COM3 non utilizzato.
COM4 non utilizzato.
Una volta inseriti i parametri con il comando Create All dal menù Edit saranno prodotte le finestre associate ai vari Chip presenti nella nostra configurazione. Quella associata ad I8259PIC è presentata in Fig. 19.
Fig. 19-Registri del PIC
In questo dispositivo l'indirizzamento dei 5 registri a 8 bit è più complesso rispetto agli altri; infatti, in generale il registro indirizzato dipende dal valore del bit 0 dell'indirizzo, dal tipo d'accesso, dal valore dei bit 6 e 7 (detti rispettivamente RR e RIS) del registro CNTRL e dallo stato del componente, cioè se è stato appena resettato.
Iniziamo la descrizione dal registro IRR (Interrupt Request Register) che permette di memorizzare le richieste d'interruzione relative alle singole linee d'interruzioni, ad esempio il bit 0 è posto ad 1 se sulla linea 0 è arrivata una richiesta di interruzione e così per gli altri bit. Quando la richiesta d'interruzione, arrivata sulla linea n, viene spedita al gestore delle interruzioni (PIC o CPU) collegato al PIC, il bit n-esimo di IRR è cancellato. Ricordiamo che la linea a priorità maggiore è la linea 0 e che la priorità decresce fino alla linea 7. Questo registro è accessibile solo in lettura all'indirizzo pari quando il bit RR=1 e RIS=0.
Il registro IMR ha la funzione di memorizzare le linee di interruzioni che devono essere mascherate, cioè quelle linee su cui arrivano delle richieste d'interruzioni che non desideriamo spedire al gestore d'interruzioni: per mascherare una linea basta inserire un '1' nel bit corrispondente. IMR è accessibile sia in scrittura che in lettura all'indirizzo dispari: in scrittura il componente non deve essere nello stato resettato, cioè deve essere già stato caricato il registro TR di cui parleremo più avanti.
In ISR (In
Service Register), invece, sono memorizzate le interruzioni trasmesse, cioè se
è stata trasmessa un'interruzione arrivata
sulla linea n, il bit n-esimo di ISR viene posto ad 1. I bit vengono
cancellati automaticamente qualora questa opzione sia abilitata nel registro CNTRL, in caso contrario sarà compito della routine, che serve
l'interruzione, cancellare il bit sempre attraverso il registro CNTRL. Infatti, ISR è un registro a sola lettura ed è accessibile quando
l'indirizzo è pari e RR ed RIS sono entrambi pari ad 1.
Tabella 6 - Significato dei bit di CNTRL
TR (Type Register) è il registro dove è conservato il tipo di interruzione (o vector number) da trasmettere ed è utilizzato dal processore per calcolare l'indirizzo dove è contenuto il puntatore alla routine, che serve quel tipo di interruzione. Questo registro è accessibile in scrittura all'indirizzo dispari solo quando il dispositivo viene resettato ed il byte che inseriamo influenza solo i 5 bit più significativi, mentre gli altri 3 sono settati dal dispositivo in funzione della linea su cui è arrivata l'interruzione da trasmettere, ad esempio per la linea 5 i 3 bit saranno settati ad 101.
Concludiamo questa descrizione con il registro CNTRL; esso è accessibile sia in
lettura che in scrittura all'indirizzo pari, ma in lettura deve essere RR=0. Il significato dei bit è specificato
in Tabella
6 .
Tabella 7-indirizzamento dei registri del gestore programmabile delle interruzioni
Un quadro riassuntivo sugli indirizzamenti dei vari registri è mostrato in Errore. L'origine riferimento non è stata trovata..
L'inizializzazione di questo componente consiste in primo luogo nell'inserire nel registro TR il tipo di interruzione (o vector number) da trasmettere al processore. Questa operazione va fatta dopo un reset del componente, facendo un accesso in scrittura all'indirizzo dispari; da questo momento in poi, tutti gli accessi in scittura all'indirizzo dispari selezionano il registro IMR.
Successivamente, scrivendo all'indirizzo pari, si deve fissare in CNTRL il modo in cui viene cancellato il bit in ISR, cioè in modo automatico o dalla routine che serve l'interruzione. Con questa scelta noi definiamo anche se, mentre è in esecuzione la routine che serve l'interruzione , sono bloccate le richieste d'interruzione di livello inferiore.
Se la cancellazione del bit in ISR non è automatica è compito della routine che serve l'interruzione cancellarlo scrivendo un byte in CNTRL che contenga nei tre bit meno significativi il numero del bit da cancellare ed il valore 1 nel bit 3.
Infine caricando il registro IMR all'indirizzo dispari noi possiamo mascherare le singole linee di richieste.
Un esempio di una sequenza di inizializzazione del gestore delle interruzioni programmabili è riportato in Fig. 20. A0 è stato precedentemente caricato con l'indirizzo più basso associato al PIC
move.b #$40,1(A0)
move.b #$10,(A0)
move.b #$F0,1(A0)
Fig. 20-Esempio di sequenza di inizializzazione del PIC
La prima istruzione inserisce il vector number, 40 esad., in TR. La seconda determina la cancellazione automatica del bit in ISR. L'ultima maschera le interruzioni delle linee da 4 a 7.
Le interruzioni, che arrivano sulle linee di richiesta, pongono ad 1 il relativo bit del registro IRR; ad esempio, se un interruzione arriva sulla linea n, sarà posto ad 1 il bit n-esimo di IRR .
Tra tutte le interruzioni che arrivano da altri device sulle linee di richiesta IR0/IR7 del componente, solo quella con priorità maggiore e non mascherata sarà da esso scelta.
Con priorità maggiore significa quella presente sulla linea a più alta priorità e nel caso che su una linea sono collegati più device, che generano interruzioni contemporaneamente, viene scelta quello a priorità maggiore. In ASIM, infatti, è stato predisposto un meccanismo per simulare un circuito Daisy Chain con 16 gradi di priorità per linea; il valore di questo grado viene spedito al PICinsieme al numero della linea. Il vector number non deve essere spedito, in quanto sarà il gestore stesso a produrre un proprio vettore e in seguito vedremo come.
Un'interruzione arrivata sulla linea n, si dice non mascherata quando il bit n-esimo del registro IMR è pari a 0.
Appena viene scelta l'interruzione, con la più alta priorità non mascherata, il dispositivo modifica i tre bit meno significativi del registro TR che assumono valori, tali che, insieme, formano il numero della linea sulla quale è arrivata l'interruzione scelta. Gli altri cinque bit del registro TR, che contiene il vector number da spedire al processore, sono fissati quando andiamo a scrivere in esso; operazione che deve essere fatta appena dopo che il componente è stato resettato.
A questo punto, se l'interruzione scelta è giunta sulla linea n, essa sarà trasmessa al processore, solo qualora i bit da n a 7 in ISR sono nulli.
Se l'interruzione viene trasmessa, il bit n di ISR viene posto ad 1, il bit n di IRR viene posto a 0, e se il bit 4 di CNTRL , citato come AEOI, è pari ad 1, allora il bit n di ISR viene posto a 0 altrimenti sarà compito della routine, che serve l'interruzione, annullarlo. Per azzerare un bit di ISR dobbiamo specificarne il numero nei tre bit meno significativi di CNTRL e contemporaneamente porre il quarto bit, riferito come EOI, ad 1.
Appunti su: |
|