INTERFACCIAMENTO INPUT-OUTPUT, GESTIONE DELLE INTERRUZIONI E GESTIONE DELLE PERIFERICHE



Documenti analoghi
Ing. Paolo Domenici PREFAZIONE

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

DMA Accesso Diretto alla Memoria

CPU. Maurizio Palesi

Dispensa di Informatica I.1

LABORATORIO DI SISTEMI

Input/Output. Moduli di Input/ Output. gestiscono quantità di dati differenti a velocità diverse in formati diversi. n Grande varietà di periferiche

DATA: CLASSE: V a EL. TITOLO: ELABORAZIONE DEL SISTEMA OPERATIVO PER mp0

ARCHITETTURE MICROPROGRAMMATE. 1. Necessità di un architettura microprogrammata 1. Cos è un architettura microprogrammata? 4

Il sistema di I/O. Hardware di I/O Interfacce di I/O Software di I/O. Introduzione

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

4 3 4 = 4 x x x 10 0 aaa

Architettura hardware

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Struttura del calcolatore

Architettura di un calcolatore

MANUALE ESSE3 Gestione Registro delle lezioni

SISTEMI DI NUMERAZIONE E CODICI

FONDAMENTI di INFORMATICA L. Mezzalira

Sistemi Operativi. 5 Gestione della memoria

Gestione Risorse Umane Web

Complemento al corso di Fondamenti di Informatica I corsi di laurea in ingegneria, settore dell informazione Università la Sapienza Consorzio Nettuno

NUOVA PROCEDURA COPIA ED INCOLLA PER L INSERIMENTO DELLE CLASSIFICHE NEL SISTEMA INFORMATICO KSPORT.

Architettura hw. La memoria e la cpu

STRUTTURE DEI SISTEMI DI CALCOLO

L unità di controllo. Il processore: unità di controllo. Le macchine a stati finiti. Struttura della macchina a stati finiti

MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

SISTEMI OPERATIVI. Prof. Enrico Terrone A. S: 2008/09

ZFIDELITY - ZSE Software & Engineering Pag.1 / 11

Corso di Sistemi di Elaborazione delle informazioni

GHPPEditor è un software realizzato per produrre in modo rapido e guidato un part program per controlli numerici Heidenhain.

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

lo PERSONALIZZARE LA FINESTRA DI WORD 2000

Manuale Terminal Manager 2.0

Gestione del processore e dei processi

Esame di INFORMATICA

Soluzione dell esercizio del 12 Febbraio 2004

Invio SMS. DM Board ICS Invio SMS

Architettura del calcolatore

Gestione della memoria centrale

INSTALLAZIONE NUOVO CLIENT TUTTOTEL (04 Novembre 2014)

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

risulta (x) = 1 se x < 0.

Registratori di Cassa

Approccio stratificato

Architettura di un sistema di calcolo

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

Architettura della CPU e linguaggio assembly Corso di Abilità Informatiche Laurea in Fisica. prof. ing. Corrado Santoro

4. Operazioni aritmetiche con i numeri binari

Laboratorio di Informatica

clock DATA BUS ADDRESS BUS CONTROL BUS In realtà il bus del microprocessore si compone di 3 bus diversi: Bus indirizzi Bus di controllo

Il processore. Il processore. Il processore. Il processore. Architettura dell elaboratore

Funzioni in C. Violetta Lonati

Sistema Operativo. Fondamenti di Informatica 1. Il Sistema Operativo

Coordinazione Distribuita

1. Che cos è la multiprogrammazione? Si può realizzare su un sistema monoprocessore? 2. Quali sono i servizi offerti dai sistemi operativi?

Convertitori numerici in Excel

File, Modifica, Visualizza, Strumenti, Messaggio

Progettaz. e sviluppo Data Base

Guida Rapida di Syncronize Backup

Esercizi su. Funzioni

Introduzione all'architettura dei Calcolatori

ARCHITETTURA DELL ELABORATORE

Gestione di una UART SOFTWARE.

Il Sistema Operativo

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.6. Unità di controllo microprogrammata

Algoritmi e strutture dati. Codici di Huffman

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO e PARAMETRI2015

SOMMARIO... 3 INTRODUZIONE...

Corso di Informatica

IRSplit. Istruzioni d uso 07/10-01 PC

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste

Sottosistema di Ingresso/Uscita (I/O)

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

f(x) = 1 x. Il dominio di questa funzione è il sottoinsieme proprio di R dato da

ESEMPIO 1: eseguire il complemento a 10 di 765

Creare una Rete Locale Lezione n. 1

MOCA. Modulo Candidatura. [Manuale versione 1.0 marzo 2013]

Il sistema di I/O. Calcolatori Elettronici 1. Architettura a bus singolo. Memoria. Unità di I/O. Interfaccia. Unità di I/O.

ARCHITETTURA DI RETE FOLEGNANI ANDREA

Testi di Esercizi e Quesiti 1

Che differenza c è tra una richiesta XML ed una domanda XML? (pag. 4)

Determinare la grandezza della sottorete

PROGETTO PER LA TRASMISSIONE DOCUMENTI RELATIVI ALL APPROVAZIONE DELLE MANIFESTAZIONI IN FORMA DIGITALE

Laboratorio di Informatica

2.0 Gli archivi. 2.1 Inserire gli archivi. 2.2 Archivio Clienti, Fornitori, Materiali, Noleggi ed Altri Costi. Impresa Edile Guida all uso

Il calendario di Windows Vista

Manuale di Aggiornamento BOLLETTINO. Rel H4. DATALOG Soluzioni Integrate a 32 Bit

Introduzione. Coordinazione Distribuita. Ordinamento degli eventi. Realizzazione di. Mutua Esclusione Distribuita (DME)

Corso di Informatica

3. Introduzione all'internetworking

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

RISOLUTORE AUTOMATICO PER SUDOKU

Stampe in rete Implementazione corretta

Architettura del computer (C.Busso)

CREAZIONE ARCHIVI 2014

Nuova procedura di Cassa Contanti Wingesfar: istruzioni per le farmacie Novembre 2009

Transcript:

INTERFACCIAMENTO INPUT-OUTPUT, GESTIONE DELLE INTERRUZIONI E GESTIONE DELLE PERIFERICHE IV a EL. Analisi delle strutture di interfacciamento per ingressi ed uscite, analisi dei segnali di interruzione, analisi delle modalità di gestione delle varie periferiche e analisi di programmi che consentono al microprocessore di colloquiare con quest ultime mediante la gestione dei segnali di interruzione.

Fin qui abbiamo solo discusso di trasferimenti che avevano luogo tra il microprocessore e la memoria e viceversa Come risulta logico, avere un sistema incapace di colloquiare con il mondo esterno è totalmente inutile perché si va a compromettere sia il funzionamento e soprattutto si restringe il campo di utilizzo di tale sistema. Dunque emerge l esigenza di avere alcuni dispositivi che diano al sistema la possibilità di colloquiare anche con il mondo esterno e questi dispositivi si definiscono dispositivi di interfacciamento input-output. Anche questa tipologia di dispositivi è collegata al microprocessore mediante i tre bus principali (dati,indirizzi e controllo). uando il microprocessore fa un trasferimento verso le interfacce deve poter decidere verso quale periferica mandare il dato. Tutto questo viene fatto sfruttando l A-BUS. Alla luce di ciò si capisce che il dato che aspetta di essere trasferito transiterà sul D-BUS ed il C-BUS avrà il compito fondamentale di stabilire se l operazione in corso è una scrittura o una lettura e di coordinare tutte le altre operazioni mediante un segnale di clock. --ARCHITETTURE DI COLLEGAMENTO DELLE PERIFERICHE-- A prescindere dalle caratteristiche di trasferimento dei dati verso le interfacce, esistono fondamentalmente due architetture per il collegamento di quest ultime che sono: COLLEGAMENTO MEMORY MAPPED I/O : (I/O mappato in memoria) in questo caso sia la memoria che le interfacce sono viste dal sistema come due cose uguali. In questa configurazione del totale delle locazioni indirizzabili, la maggior parte viene dedicata alla memoria mentre quelle restanti vengono dedicate alle interfacce. Per il corretto funzionamento di questa tipologia di collegamento si richiedono opportune reti di decodifica il cui compito è quello di distinguere se l indirizzo che transita sull A-BUS serve per aprire una specifica locazione di memoria o al contrario serve per selezionare una determinata periferica. Il vantaggio di quest architettura è quello che le medesime istruzioni vengono usate con la memoria e possono essere usate anche per i dispositivi di interfaccia. Un microprocessore che fa uso di questa particolare architettura di gestione è il 6502 della Rockwell. COLLEGAMENTO ISOLATED I/O : (I/O isolato) in questo caso invece il microprocessore opera una distinzione tra le operazioni di memoria e quelle per le interfacce. Sul C-BUS infatti viene previsto un ulteriore segnale il cui compito è quello di selezionare o l interfaccia oppure la memoria. Del totale delle locazioni indirizzabili, tutte sono utilizzabili indistintamente sia dalla memoria che dai dispositivi di interfaccia. Il vantaggio più grande di questo tipo di architettura è che si

ha un guadagno a livello di locazioni indirizzabili e tutto ciò senza andare a modificare la struttura interna del sistema. Un microprocessore che usa questo tipo di architettura è lo Z80 della Zilog. A questi tipi di architetture definite unibus (tutto ciò perché non sono previsti bus separati per la memoria e le interfacce) se ne aggiunge una definita multibus con la quale si dispongono bus differenti per la memoria e per le interfacce con il vantaggio di poter effettuare trasferimenti con la memoria e con le interfacce simultaneamente. Il cablaggio effettuato con questa tecnica è esposto qui di seguito: µp MEMORIA INTERFACCE C-BUS D-BUS A-BUS Il mp0 utilizza la struttura unibus con I/o isolato. --COMPOSIZIONE DEL BUS DI CONTROLLO DEL mp0-- Il C-BUS del mp0 comprende una serie di segnali di abilitazione di cui qui di seguito è riportata la descrizione: MRE: (richiesta di memoria), questo segnale viene abilitato dalla CU quando si deve effettuare una transizione di dati tra microprocessore e memoria. IORE: (richiesta di interfacce), questo segnale viene abilitato dalla CU nel momento in cui si deve effettuare un trasferimento dati dal microprocessore e le interfacce. R/W: questo segnale viene abilitato dalla CU quando si deve effettuare una lettura (dalla memoria o dalle interfacce portando a livello logico 1 il segnale) oppure una scrittura (in memoria o nei registri di interfaccia portando a livello logico zero il segnale). INT: questo segnale viene abilitato per richiedere un interruzione (argomento che varrà trattato nelle prossime pagine). CLOCK: è il segnale principale ed è quello che da la sincronizzazione

ai dispositivi collegati. --DISPOSITIVI DI I/O-- Potendo indirizzare 256 locazioni di memoria, potremmo dire che il mp0 può avere collegati 256 dispositivi diversi. Nella realtà però, il programma che simula il funzionamento interno del mp0 prevede solamente il collegamento di due porte di ingresso ed una di uscita dove: L indirizzo $E0 è quello della prima porta di ingresso che corrisponde praticamente all ingresso predisposto per la tastiera. L indirizzo $F0 è quello della seconda porta di ingresso che ci permette di acquisire dati attraverso la porta parallela del computer. In fase di scrittura questa locazione diventa una porta di uscita di 8 bit che si appoggia sempre sulla porta parallela. Analizziamo per prima la porta di uscita di tipo parallelo Un ipotetica porta di uscita di tipo parallelo può essere costituita da una struttura formata da 8 DFF i cui ingressi sono direttamente collegati al D-BUS. Le uscite del circuito stesso sono messe a disposizione dell utilizzatore. La struttura avuta con l uso dei DFF è fondamentale perché il dato in fase di scrittura, rimane sul D-BUS per un tempo molto ridotto per poter essere apprezzato dall utilizzatore. La porta di uscita presenta due terminali designati per effettuare il controllo, questi due terminali sono: CK: è il segnale che va ad abilitare la scrittura nei DFF. Esso è gestito indirettamente dal microprocessore che lo abilita se e solo se quest ultimo deve implementare un istruzione di scrittura. OE: è il segnale che abilita le uscite a trasferire il dato verso l utilizzatore. Esso è gestito direttamente dall esterno ogni qual volta si voglia leggere gli 8 bit in uscita. Comunque la scrittura viene abilitata solo quando è attivo il segnale IORE mentre quello di R/W è a livello logico zero e sull A-BUS transita l indirizzo della porta nella quale si devono scrivere i dati. Per l attivazione del segnale di scrittura il mp0 si serve di un opportuna rete di decodifica che non appena si verifica che quando l A-BUS= F0H porta a livello alto il segnale di scrittura IORE e porta a livello basso quello di R/W. Lo schema della rete di decodifica è riportato qui di seguito: D-BUS A-BUS C-BUS

R /W IOR E B it meno significativo (A0) DECODER Abilitazione scrittura B it più significativo (A7) uesta rete di decodifica così fatta potrebbe idealmente funzionare ma presenta delle limitazioni ovvero: Il microprocessore non sa se il dato che è stato scritto a sua volta è stato letto dall utilizzatore L utilizzatore non sa se il dato che ha letto è un nuovo dato oppure quello letto in precedenza. Per ovviare a questo inconveniente, possiamo disporre una sorta di regolatore di scambi il quale funge da indicatore di stato della porta. uesto lavoro può essere svolto da un flag. uesto flag assumerà il livello alto quando il microprocessore scrive un dato nei DFF e leggendo questo flag l utilizzatore potrà sapere con certezza che il dato presente nella porta di uscita è un nuovo dato. Dopo che l utilizzatore ha acquisito il dato provvederà a cambiare lo stato del flag (portandolo al suo livello basso). Finchè il flag poi non torna allo stato alto, l utilizzatore sa che nessun nuovo dato è stato scritto nella porta di uscita. Dalla parte del microprocessore, esso vedendo lo stato del flag potrà sapere se il dato che era presente nella porta di uscita è stato prelevato oppure no. uesto modo di comunicare tra due punti (che risultano essere il microprocessore e la porta di uscita) fatto di opportuni scambi di segnali che vanno ad informare reciprocamente i due punti in comunicazione è detto protocollo di Handshaking. uesti protocolli sono necessari ogni qual volta si deve instaurare la comunicazione tra due punti del sistema che tra loro sono asincroni oppure hanno velocità di risposta differenti. La realizzazione del flag può essere realizzata mediante l uso di un latch di tipo SR. Lo schema di cablaggio di una porta di uscita di tipo parallelo è illustrato qui sotto: mp0 memoria D-BUS A-BUS C-BUS Rete di decodifica CK porta OE Rete Dati per di decodifica utilizzatore Lettura S R Dato pronto

Il comando di set del latch è gestito dal microprocessore quando effettua un operazione di scrittura e viene dunque collegato assieme al segnale CK della porta. Il comando reset viene generato nel momento in cui l utilizzatore effettua la lettura dei DFF abilitando dunque il segnale di Output-Enable (OE). Dunque il pin di reset può essere collegato direttamente al segnale OE della porta di uscita. L uscita del latch viene poi portata all esterno in modo tale che sia all attenzione dell utilizzatore. Dopo queste considerazioni, vediamo anche come il flag può essere letto dal microprocessore Il microprocessore per scrivere un dato nella porta di uscita va ad abilitare il segnale IORE e porta a livello logico basso il segnale R/W ed infine mette il dato da scrivere sul D-BUS. La rete di decodifica è collegata sia all A-BUS che al C-BUS e dunque riconosce l indirizzo e il tipo di istruzione e genera un segnale di scrittura nella porta di uscita. Il dato che transita simultaneamente sul D-BUS viene scritto nei DFF della porta. Contemporaneamente a ciò il segnale che abilita la scrittura nella porta arriva anche al terminale di set perciò la sua uscita varrà 1, ovvero in uscita è disponibile un nuovo dato. L utilizzatore,vedendo lo stato del latch può capire che un nuovo dato è disponibile nella porta di uscita. L utilizzatore a sua volta acquisisce questo dato abilitando il comando di lettura che va sia ad attivare i buffer three-state della porta e ripristina l uscita del latch al livello basso. Fin quando il microprocessore non scrive altri dati nella porta il flag resterà a livello logico zero. Il microprocessore può leggere il flag se andiamo a collegare una delle due uscite del latch al D-BUS. uesta uscita però non o può essere collegata direttamente al bus perché sennò andremmo a bloccare la linea di quest ultimo. Per evitare di incorrere in questi problemi si abilita il collegamento dell uscita del latch ad uno dei bit del D-bus solo quando il microprocessore effettua una lettura del flag. Per la gestione delle abilitazioni tra l uscita del latch ed il D-BUS si interpone un buffer threee-state. L abilitazione del buffer viene gestita a sua volta mediante una rete di decodifica che decodificherà gli indirizzi ed i segnali del C-BUS. La locazione dove è previsto il flag è $F1. Detto ciò possiamo dire che il buffer collegato all uscita del latch viene abilitato solo se sull A-BUS transita l indirizzo $F1 perciò è abilitato il segnale IORE e quello di R/W viene portato a livello alto consentendo al microprocessore di leggere il flag. La rete di decodifica è la seguente: D-BUS

A-BUS C-BUS R /W IOR E B it meno significativo (A0) DECODER Abilitazione three-state B it più significativo (A7) Con quest ultimo accorgimento possiamo illustrare anche la struttura completa di una porta di uscita di tipo parallelo: Three-state mp0 memoria D-BUS A-BUS C-BUS Le reti di decodifica (quella per leggere il flag e quella per scrivere nel latch sono Rete di decodifica state assimilate in un unico blocco. Si è scelto di collegare al D-BUS tramite il buffer l uscita del latch SR perché in questo modo se il Lettura microprocessore legge zero nel latch vuol dire che nella porta Dè ati già per presente utilizzatore un dato. Dopo che l utilizzatore ha acquisito il dato l uscita del latch si porta a zero e quella va ad 1 indicando che la porta è libera. Se noi consideriamo la porta parallela di uscita come qualcosa di singolo, vedremo che essa è una struttura dotata di simmetria tra l interno e l esterno: USCITA: Dal microprocessore Rete di decodifica CK porta OE S R Dato pronto DATI IN INGR E S S O S CR ITTUR A S CK porta OE R POR TA LIBE R A Rete di decodifica DATI IN US CITA LE TTUR A DATO PR ONTO

All utilizzatore INGRESSO: Al microprocessore DATI IN US CITA LE TTUR A CK porta OE Rete di decodifica DATI IN INGR E S S O S CR ITTUR A Dall utilizzatore S R DATO PR ONTO POR TA LIBE R A Da questi due schemi emerge una conclusione fondamentale: che se si invertono i collegamenti di una porta di uscita riusciremo ad ottenere una porta di ingresso. Anche la porta di ingresso deve avere le uscite three-state perché non è possibile collegarle direttamente sul D-BUS. Anche in questo caso la cosa più utile da fare è quella di usare una porta che abbia memoria. Con questa porta si evita che il dato venga perso. Una porta di d ingresso in linea generale funziona in questo modo : L utilizzatore scrive nella porta mandando gli 8 bit ed abilitando il segnale di scrittura Tutto ciò provoca la memorizzazione del dato e porta a livello alto l uscita del latch. uesta uscita indicherà al microprocessore che un nuovo dato è stato scritto nella porta di ingresso. Arrivati a questo punto il microprocessore deve poter leggere lo stato dell uscita del latch e per rendere il suo valore reperibile sul D-BUS si collega a quest ultimo mediante un buffer three-state ed una rete di decodifica di cui qui sotto riportiamo lo schema: D-BUS A-BUS C-BUS R /W IOR E B it meno significativo (A0) DECODER Abilitazione lettura B it più significativo (A7)

uando l uscita del latch si porta ad 1, un nuovo dato è pronto per essere acquisito dal microprocessore mentre l altra uscita trovandosi a zero indica all utilizzatore che la porta è occupata. uando il microprocessore si trova a d effettuare una lettura da questa porta esso abilitava ad abilitare il terminale di OE e ripristina a zero lo stato dell uscita del latch. Così facendo l uscita del latch si porta ad 1 informando che la porta è libera. Nel caso specifico del mp0 le due porte di ingresso si trovano rispettivamente: Alla locazione $E0 (tastiera) Alla locazione $F0 (stesso indirizzo della porta di uscita verso la porta parallela della stampante). la rete di decodifica darà 1 in uscita se sull A-BUS transiterà l indirizzo della locazione F0H. Nel simulatore per mp0 il flag per la porta di ingresso alla locazione F0H è situato alla locazione F2H. La rete di decodifica di questo flag è illustrata qui sotto: D-BUS A-BUS C-BUS R /W IOR E B it meno significativo (A0) DECODER Abilitazione three-state B it più significativo (A7) Dopo quest ultimo accorgimento, la struttura completa di una porta di ingresso di tipo parallelo risulta essere la seguente: Three-state mp0 memoria D-BUS A-BUS C-BUS Rete di decodifica CK porta OE Rete D ati dall di decodifica utilizzatore S R

scrittura P orta libera Infine il flag della porta di ingresso collegata alla tastiera (locazione E0H) è collocato alla locazione E2H. --GESTIONE DELLE PORTE DI I/O-- Adesso occupiamoci di come un microprocessore riesce a gestire una porta di ingresso-uscita Nel trasferimento dei dati verso l esterno, il microprocessore non ha problemi nello svolgere questa operazione, l unico accorgimento è che il programma che si occupa del trasferimento dati verso l esterno deve controllare lo stato del flag di uscita per vedere se l utilizzatore ha acquisito il dato. Il criterio con i quale si può effettuare la gestione di una porta di uscita è il seguente: ripeti finchè FLAG=1 (uscita del latch) invia dato uesto criterio può essere usato senza problemi ma presenta un inconveniente, ossia finchè il flag della porta di uscita non si porta a livello alto il microprocessore non può più implementare nessuna operazione in quanto si trova ad eseguire un ciclo di attesa. Per ovviare a questo inconveniente, un programma che deve effettuare la gestione della porta di uscita può essere scritto seguendo l array qui sotto illustrato: inizia CONTATORE 0 ripeti leggi MEM [CONTATORE] invia dato appena letto incrementa CONTATORE finchè CONTATORE = 0 fine. Da qui deriva la seguente traduzione in assembly: 0 LDA #0 inizializzazione CONTATORE 2 STA $20 salva CONTATORE in una locazione variabile 4 LDA ($20) carica in accumulatore l indirizzo indicato dalla locazione CONTATORE 6 CALL 20 chiama il sottoprogramma per l invio dati

8 LDA $20 carica il valore del CONTATORE 10 ADD #1 incrementalo di 1 12 JZ 16 se CONTATORE = 0 termina 14 JMP 2 oppure aggiorna il contenuto della variabile CONTATORE 16 HLT terminazione del programma 20 PUSH salva momentaneamente il contenuto dell ACC nello stack 21 IN $F1 carica in ACC lo stato del flag della porta di uscita 23 AND #1 mascherane tutti i bit meno che l LSB 25 JZ 21 se ACC=0 il dato di prima ancora non è stato letto, perciò salta e ricontrolla nuovamente lo stato del flag 27 POP recupera il dato dallo stack 28 OUT $F0 scrivi questo dato nella porta di uscita 30 RET ritorna al programma principale Nel mp0 per leggere o scrivere nelle porte I/O sono state predisposte due istruzioni di trasferimento che sono: IN: con la quale ci è consentito leggere dalla porta che è specificata nel campo di indirizzo con il consecutivo trasferimento del dato nell accumulatore. Tipo di indirizzamento Codice operativo Codice operativo in Hex diretto 10010010 92 OUT: con la quale ci è consentito scrivere nella porta di interfaccia specificata dal campo di indirizzo. Il dato transita dall ACC verso la porta. Tipo di indirizzamento Codice operativo Codice operativo in Hex diretto 10011001 9A Nel programma che simula il funzionamento del mp0 si può vedere in maniera istantanea come variano gli stati dei vari flag. Però in un operazione di trasferimento dati, questi ultimi vengono lasciati per un breve tempo in una locazione di memoria definita buffer. Per vedere meglio l utilità di un buffer, immaginiamo di scrivere un programma il quale acquisisce i dati dalla porta di ingresso $E0 (tastiera) e li alloca nel buffer che si estende dalle locazioni $A0 a $AF. Un programma di questo genere può essere riassunto nel seguente array: inizia BUFFER $A0 ripeti ripeti

leggi il flag della porta di ingresso $E0 finchè flag = 1 (dato pronto) leggi dato MEM [BUFFER] dato appena letto Incrementa BUFFER finchè BUFFER = $B0 fine. Supponendo la locazione 20 come BUFFER la traduzione in assembly di questo array è la seguente: 0 LDA #$A0 carica in ACC la locazione di partenza del buffer 2 STA $20 salva il contenuto dell ACC nella locazione variabile 20 4 IN $E0 leggi il flag della porta di ingresso ($E0) 6 AND #1 e mascherane tutti i bit eccetto l LSB 8 JZ 4 se flag=0 torna a controllare il flga oppure 10 IN $E0 leggi il dato dalla porta di ingresso e 12 STA ($20) salvalo nella locazione puntata da BUFFER 14 LDA $20 carica in ACC il valore del buffer 16 ADD #1 incrementalo 18 PUSH e poi salvalo nello stack 19 ADD #$50 somma il complemento a due di $B0 (ovvero $50) 21 JZ 26 se il risultato è zero il buffer è pieno oppure 23 POP recupera il valore del buffer 24 JMP 2 dallo stack e torna all inizio del ciclo 26 HLT fine programma Nel caso in cui noi andiamo ad utilizzare il mp0, dobbiamo sempre tenere sotto controllo lo stato del flag della porta di ingresso in quanto quando esso si porta a livello basso è possibile fornire un nuovo dato perché se lo si fa prima il dato precedentemente inserito andrebbe perso. Dobbiamo anche tenere presente la scarsa velocità del mp0 che presenta un clock di sistema di pochi Hz. e può eseguire poche istruzioni in un secondo non tenendo conto che istruzioni più complesse richiedono maggiori cicli di clock per essere eseguite. --INTERRUZIONI-- abbiamo appena analizzato la possibilità del microprocessore di colloquiare con una porta di uscita tramite il controllo ciclico del flag, ma adesso andiamo ad analizzare la situazione in cui il microprocessore deve gestire più di una porta di uscita Il primo metodo utilizzato per gestire una moltitudine di porte è il cosiddetto polling il quale consiste nell interrogazione ciclica dei flag di ogni singola porta. peràò questo metodo gestionale presenta un inconveniente di fondo, ossia il

microprocessore perde parte del suo tempo per effettuare il controllo delle periferiche anche quando non vi è nessun dato in arrivo. Il meccanismo con il quale una periferica informa il sistema che in essa è presente un nuovo dato è detto interruzione o interrupt. Le interruzioni sono gestite in maniera differente in base al tipo di microprocessore. Per far si che la periferica possa interrompere ciò che il microprocessore sta facendo quest ultimo deve mettere a disposizione un terminale apposito che verrà poi collegato alla linea del C-BUS. uando avviene un interruzione: Il sistema interrompe l esecuzione dell ultima istruzione Poi salta alla locazione dalla quale inizia il programma che ha il compito di gestire le interruzioni. Infine una volta terminato il sottoprogramma di gestione delle interruzioni il sistema ripristina il contenuto dei suoi registri e riprende la sua attività esattamente da dove l aveva fermata. Adesso analizziamo la situazione interna al sistema quando si deve eseguire una programma di gestione delle interruzioni Abbiamo accennato prima che non appena si manifesta un interruzione, il sistema salta ad eseguire un sottoprogramma per gestirla. Prima di effettuare il salto a sottoprogramma il microprocessore salva il contenuto del program counter, dell ACC e dei flag nello STACK. Non appena il sottoprogramma termina, il sistema ripristina i valori che aveva salvato nello stack proseguendo la sua attività esattamente da dove l aveva interrotta. Però le interruzioni non sempre sono eseguibili dal microprocessore, a tal fine si parla di : Interruzioni mascherabili: ovvero quella categoria di interruzioni che non vengono eseguite dal sistema in quanto si trova ad eseguire un operazione più importante. Interruzioni non mascherabili: ovvero quelle interruzioni che non possono venire disabilitate in alcun modo e che quando si verificano devono essere dunque eseguite tassativamente dal sistema. Il problema sorge quando dobbiamo gestire delle interruzioni nidificate, ovvero di interruzioni che sorgono mentre un programma di gestione delle interruzioni è già in esecuzione. Per gestire al meglio questo problema viene previsto un preciso meccanismo che viene definito di priorità delle interruzioni. Immaginiamo perciò di avere tre diverse periferiche: P3,P2 e P1. Supponiamo che la periferica P3 sia prioritaria rispetto a P2 e P1 e che la periferica P2 sia prioritaria solo rispetto alla periferica P1. Supponiamo ora che la periferica P1 generi un interruzione e che poi sopraggiungano anche quelle generate da P3 e P2. Il microprocessore inizia dunque a gestire la periferica P1 ma non appena sopraggiunge l interruzione della periferica P3, esso dovrà gestire quest ultima

periferica. Invece quando il microprocessore dovrà gestire l interruzione della periferica P2, questa verrà eseguita prioritariamente a scapito della periferica P1 ma non a scapito della periferica P3 che come abbiamo detto è la più prioritaria tra le tre. Per la gestione di questo meccanismo sono previsti due diversi tipi di approcci: Approccio hardware: realizzato mediante una gestione a catena o daisy chain con il quale le periferiche sono collegate al bus in cascata. Così facendo ogni periferica può generare un interruzione ma solo se viene abilitata dalla periferica che la precede. Alla luce di ciò ogni periferica verrà dotata di un ingresso IEI e di un uscita IEO che servono per abilitare le interruzioni: lo schema della gestione daisy chain è riportato qui sotto: microproces s ore P3 IE O IEI P2 IE O IEI P1 IEO Con questo tipo di approccio se P3 genera un interruzione disabilita automaticamente tutte le altre. Se invece è P2 a generare un interruzione, la disabilitazione avviene solo per la periferica P1 mentre P3 essendo la più prioritaria della catena di gestione è comunque libera di generare interruzioni. Approccio software: realizzato mediante l uso di un registro i cui bit indicano l abilitazione delle varie periferiche. Così facendo si potranno gestire tante periferiche quanti sono i bit del registro. Se un bit generico del registro si trova a livello alto il segnale di interruzione di una periferica generica potrà interrompere l operato del microprocessore oppure se così non fosse verrebbe mascherata. Il registro delle interruzioni può essere poi programmato e ciò ci consente di gestire la priorità delle periferiche in maniera abbastanza flessibile. uesto registro è situato indifferentemente o all interno o all esterno del microprocessore ma l importante è che da esso sia possibile sia leggere che scrivere. Esso può anche essere fatto come una vera e propria porta ingresso/uscita nella quale immettendo è possibile modificare la gestione delle priorità delle periferiche. Lo schema della gestione di tipo software è esposto qui di seguito: R E GIS TR O INTE R R UZIONI INT 1 INT 2 AL M ICROPR OC INTE S S OR E OR INT 3

--INTERRUZIONI E PORTE DI I/O-- La gestione delle interruzioni ci può tornare utile anche se ci troviamo a gestire porte I/O di sola uscita. Consideriamo ora la parte di sottoprogramma utile per scrivere nella porta di uscita: 20 PUSH salva il contenuto dell ACC nello stack 21 IN $F1 carica in ACC lo stato del flag della porta di uscita 23 AND #1 maschera tutti i bit eccetto l LSB 25 JZ 21 se ACC=0 il dato precedente non è stato ancora letto, dunque ricontrolla nuovamente il flag 27 POP recupera il dato da inviare dallo stack 28 $F0 scrivi il dato nella porta di uscita 30 RET ritorna al programma principale Nel caso in cui il dispositivo esterno per qualunque motivo non acquisisce il dato, l uscita del latch non torna mai ad 1 e si rischia di far fare al microprocessore un ciclo senza fine del controllo del flag della porta di uscita. In altri casi si ha che il tempo che intercorre tra una lettura ed una scrittura può essere abbastanza lungo ed il microprocessore è coinvolto in questo controllo mentre potrebbe svolgere altre operazioni. Per ovviare a questo inconveniente potremmo impostare un tempo massimo di attesa oltre il quale il microprocessore rinuncia a scrivere il dato segnalando un errore di timeout.

--INTRODUZIONE DELLE INTERRUZIONI NELLE PORTE DI I/O-- PORTA DI USCITA: Three-state mp0 memoria INT D-BUS A-BUS C-BUS Rete di decodifica CK porta OE Rete di decodifica Lettura Aggiungendo una linea per le interruzioni, si ha che quando il dato viene letto D ati per utilizzatore dall utilizzatore l uscita del latch va a livello alto generando un interruzione. Così facendo il microprocessore può essere interrotto ogni qual volta avviene l acquisizione di un dato da parte dell utilizzatore. Per collegare in maniera opportuna i vari circuiti alla rete di interruzione si deve anche tener conto se le periferiche siano più di una. In linea generale tutti i microprocessori possiedono poche linee di controllo che vengono condivise tra le periferiche tramite delle reti di controllo. Inoltre nei processori il segnale di interruzione è sensibile ai fronti piuttosto che ai livelli mentre nei sistemi più sofisticati si ricorre in base alle esigenze o all una o all altra modalità. Il principio di funzionamento della gestione delle interruzioni per una porta di uscita di tipo parallelo avviene in questo modo: Il programma principale abilita le interruzioni, implementa tutte le operazioni che occorrono e salva i risultati delle varie operazioni in un buffer senza occuparsi di inviare dati alla porta di uscita. In memoria è poi presente un sottoprogramma per la gestione delle interruzioni il cui compito è quello di prendere un dato dal buffer e di mandarlo alla porta di uscita uando si manifesta un altra interruzione il microprocessore salta ad eseguire il sottoprogramma di gestione delle interruzioni che si occuperà poi di scrivere un nuovo dato nei DFF della porta di uscita. S R Dato pronto Three-state

PORTA DI INGRESSO: mp0 memoria INT D-BUS A-BUS C-BUS Rete di decodifica scrittura CK porta OE Rete di decodifica S R P orta libera Il funzionamento è assimilabile in Dlinea ati dall generale utilizzatore a quello visto per la porta di uscita. In questo caso però il segnale di interruzione è prelevato all uscita del latch. Dunque quando una dato viene scritto dall esterno l uscita del latch va a livello logico alto e genera un interruzione. Nel caso specifico del mp0 si ha a disposizione una linea INT alla quale sono collegate tutte e tre le porte ed esse vengono gestite senza alcun principio di priorità. Ogni qual volta si verifica un interruzione nel mp0 esso salva l ACC, il PC ed i flag nello stack e poi salta alla locazione 80H dove si troverà la prima istruzione del programma di gestione delle interruzioni. Le istruzioni che ci consentono di gestire le interruzioni sono tre e sono: DISABLE INTERRUPT (DI) : è un istruzione che serve per disabilitare la interruzioni Tipo di indirizzamento Codice operativo Codice operativo in Hex implicito 10101000 A8 ENABLE INTERRUPT (EI) : è un istruzione che serve per abilitare le interruzioni Tipo di indirizzamento Codice operativo Codice operativo in Hex implicito 10100000 A0 INTERRUPT RETURN (IRET) : serve a ripristinare il sistema dopo un interruzione Tipo di indirizzamento Codice operativo Codice operativo in Hex implicito 10110000 B0

Adesso immaginiamo di scrivere un programma che riesca ad acquisire dati dalla porta di ingresso alla locazione E0H (tastiera) gestito tramite le interruzioni. Per comodità possiamo immaginare che questo programma sia un programma di calcolo che consiste in un ciclo ripetuto di incremento dell ACC il cui contenuto di volta in volta viene trasferito alla porta di uscita alla locazione F0H. Il programma può essere il seguente: 0 LDA #0 carica in ACC il valore 0 2 PUSH salva il valore dell ACC nello stack 3 IN $F1 leggi il flag della porta di uscita dopodiché 5 AND #1 maschera tutti i bit eccetto l LSB 7 JZ 3 se flag=0 torna a leggere il flag 9 POP oppure recupera dallo stack il valore dell ACC 10 OUT $F0 invia tale dato alla porta di uscita 12 ADD #1 incrementa di 1 il contatore 14 JMP 2 e re-inizia il ciclo Il problema di fondo che presenta questo programma è che non è possibile controllare la porta di ingresso. Per far si che anche la porta di ingresso venga controllata bisognerà abilitarne le interruzioni. Perciò all inizio del nostro programma dovremmo prevedere un istruzione che ci consenta di abilitare le interruzioni che di norma sono disabilitate. Il programma con l aggiunta di questo accorgimento risulta essere il seguente: 0 EI abilita le interruzioni (flag I=1) 1 LDA #0 carica in ACC il valore 0 3 PUSH salva il valore dell ACC nello stack 4 IN $F1 leggi il flag della porta di uscita dopodiché 6 AND #1 maschera tutti i bit eccetto l LSB 8 JZ 3 se flag=0 torna a leggere il flag 10 POP oppure recupera dallo stack il valore dell ACC 11 OUT $F0 invia tale dato alla porta di uscita 13 ADD #1 incrementa di 1 il contatore 15 JMP 2 e re-inizia il ciclo Provando questo programma con il simulatore abbiamo riscontrato che il ciclo viene effettuato correttamente ed i dati sono inviati alla porta di uscita. Se però viene premuto un tasto, il microprocessore salva i dati nello stack e salta alla prima locazione dove è scritto il programma di gestione delle interruzioni (80H). In quella locazione però non ancora troviamo scritto il programma, dunque dobbiamo aspettarci che il microprocessore a quel punto avrà un comportamento strano che nel peggiore dei casi lo porta anche all arresto. Per evitare ciò bisogna sempre assicurarsi che siano disponibili i programmi di gestione delle interruzioni. Nel caso prima illustrato siccome non ci interessa acquisire dati dall esterno sarà sufficiente che alla locazione 80H sia scritta l istruzione IRET. Nel caso in cui invece volessimo l acquisizione di dati che provengono dall esterno e che questi debbano

essere salvati in memoria (per esempio alla locazione A0H), il sottoprogramma di gestione delle interruzioni verrà così scritto: $80 PUSH salva l accumulatore nello stack (il contenuto del PC e dei flag è stato salvato al sopraggiungere dell interruzione) $81 IN $E2 leggi il flag della tastiera $83 AND #$01 maschera tutti i bit meno che l LSB $85 JZ $8B se è zero, l interruzione non è stata generata dalla tastiera perciò ritorna $87 IN $E0 oppure leggi il dato dalla porta di ingresso $89 STA $A0 salva il dato trovato nella porta di ingresso alla locazione A0H $8B POP ripristina il contenuto dell ACC $8C IRET ritorno dall interruzione È da notare come il sottoprogramma di gestione delle interruzioni non incida minimamente sulla struttura del programma iniziale. Dal punto di vista del microprocessore esistono due modi di controllo per vedere quale periferica ha generato l interruzione e questi due modi sono: Controllo ciclico delle periferiche: nel quale il sottoprogramma di gestione delle interruzioni controlla in modo ciclico i flag di ogni singola porta e quando trova una flag attivo andrà ad eseguire la parte di sottoprogramma dedicato a quella periferica. uesto metodo tuttavia più semplice risulta avere una scarsa efficienza. Un tipo di sottoprogramma che potrebbe consentire il controllo ciclico delle periferiche è stato riassunto nel seguente array: inizia salva l ACC nello stack leggi il flag della periferica P1 se flag = 1 allora esegui il sottoprogramma di gestione di P1 leggi il flag della periferica P2 se flag = 1 allora esegui il sottoprogramma di gestione di P2... leggi il flag della periferica Pn se flag = 1 allora esegui il sottoprogramma di gestione di Pn ritorna da interruzione Tradotto in assembly il programma risulta essere il seguente: $80 PUSH salva l ACC nello stack $81 IN $54 leggi il flag di una prima porta I/O $83 AND #1 mascherane tutti i bit meno che l LSB

$85 JZ $89 se flag=0 controlla la porta I/O successiva oppure $87 CALL P1 chiama il sottoprogramma di gestione di P1 $89 IN $70 leggi il flag della seconda porta I/O $8B AND #1 mascherane tutti i bit eccetto l LSB $8D JZ $91se flag=0 controlla la porta I/O successiva oppure $8F CALL P2 chiama il sottoprogramma di gestione di P2 $C1 IN $FF leggi il flag di una terza periferica $C3 AND #1 mascherane tutti i bit tranne l LSB $C5 JZ $C9 se flag=0 recupera il valore dell ACC dallo stack oppure $C7 CALL P3 chiama il sottoprogramma di gestione di P3 $C9 POP ripristina il contenuto dell ACC $CB ritorna dall interruzione Interrupt vettorizzato: quando una periferica interrompe viene riconosciuta dal microprocessore e rende disponibile sul D-BUS un numero di identificazione. uesto numero perviene al microprocessore e viene utilizzato come indirizzo della prima istruzione del sottoprogramma di gestione delle interruzioni di quella specifica periferica. uesto metodo risulta essere il più efficiente in quanto in alcuni casi è la periferica stessa ad indicare al microprocessore qual è il programma di gestione da eseguire. CONSIDERAZIONI: non si sono verificati problemi nello svolgimento dell esperienza e tutto è stato svolto correttamente.