I MICROPROCESSORI
INTRODUZIONE
I MICROPROCESSORI sono circuiti sequenziali molto complessi. La sua
introduzione sul mercato nel 1971 ha rivoluzionato il mondo
DELL’ELABORAZIONE DEI DATI e quello DEI CONTROLLI
PROGRAMMABILI E DEI PROCESSI.
Le applicazioni sono molteplici; le più importanti sono:
- l’automazione industriale
- la strumentazione
- sistemi di telecomunicazione
- macchine per ufficio
- elettronica di consumo
I MICROPROCESSORI sono chiamati anche: SISTEMI A LOGICA
PROGRAMMATA
LOGICA CABLATA E PROGRAMMATA
I circuiti logici si distinguono in due grandi categorie:
circuiti a LOGICA CABLATA e circuiti a LOGICA PROGRAMMATA.
I CIRCUITI A LOGICA CABLATA sono i circuiti analogici e logici che
POSSONO SVOLGERE UNA SOLA FUNZIONE BEN DEFINITA. Il
funzionamento complessivo è determinato solo dal “cablaggio” dei componenti
e il campo degli utilizzi è ben definito dalle specifiche.
I CIRCUITI A LOGICA PROGRAMMATA non hanno un ben definito campo
di utilizzo. Il loro cablaggio interno varia in seguito all’esecuzione di
un’istruzione del programma che ne regola il funzionamento.
Il programma è una successione di codici ogni uno dei quali impone una
riconfigurazione interna del circuito.
E’ come se il circuito in logica programmata cambiasse continuamente
cablaggio
LOGICA CABLATA E PROGRAMMATA
Vantaggi e svantaggi della logica cablata e programmata:
- i circuiti a logica cablata per assolvere una ben definita funzione sono
generalmente molto più veloci più affidabili e molto più economici.
- i circuiti a logica programmata possono essere impiegati in molte funzioni,
anche non tutte previste a priori, con il veloce cambiamento del “programma”
LOGICA CABLATA E PROGRAMMATA
Fin dall’inizio i problemi di prezzo furono subito risolti grazie al grande utilizzo
di tali componenti in quasi tutti i settori dell’elettronica che ne ammortizzarono
subito il costo.
L’utilizzo della logica cablata oggi è rimasta solo quando si vuole:
- realizzare circuiti semplici molto economici, molto veloci e molto affidabili
ARCHITETTURA DI UN
MICROCOMPUTER
La struttura generale di un elaboratore di piccole dimensioni basata su
microprocessore è la seguente:
ARCHITETTURA DI UN MICROCOMPUTER
La memoria contiene la sequenza dei codici digitali (programma) che acquisiti e
decodificati dalla CPU determinano le fasi del processo di elaborazione. Essa
contiene inoltre i dati iniziali intermedi e finali dell’elaborazione.
I dispositivi di ingresso ed uscita rappresentano una vastissima serie di
dispositivi che consento l’introduzione dei dati all’interno del microcomputer ed
il prelievo dei risultati. Tra questi possiamo elencare la tastiera, il video, la
stampante ed anche le memorie di massa.
La CPU è l’unità di controllo che guida il microcomputer e che varrà analizzata
approfonditamente in seguito.
ARCHITETTURA DI UN MICROPROCESSORE
Supponiamo di avere inserito in maniera opportuna il “programma” nella
memoria indirizzata dal microprocessore precedente, descriviamo ora quali sono
le operazioni che la CPU svolge in successione ed il ruolo che hanno i vari
blocchi contenuti all’interno.
I REGISTRI
Sono delle celle di memori contenenti un certo numero di bit, manipolabili
singolarmente.
I registri sono caratterizzati dall’ampiezza (quanti bit per cella) e dall’indirizzo
(dove si trova la cella).
<---- Indirizzo
B7 B6 B5 B4 B3 B2 B1 B0
Ogni bit puo’ contenere un valore 0 oppure 1. Ad esempio nel registro seguente
il bit n. 5 contiene il valore 1 mentre il bit n.6 contiene il valore 0
0
0
1
1
1
0
1
0
I REGISTRI
Un certo numero di registri (di uguale numero di bit) è raggruppato in INSIEME
DI REGISTRI chiamato BANCHI.
Ogni registro è individuato da un indirizzo diverso. Facciamo un esempio di
banco con 8 registri (cassettiera di 8 cassetti ogn’uno dei quali ha 8 scomparti)
<---- Indirizzo 000
<---- Indirizzo 001
<---- Indirizzo 010
<---- Indirizzo 011
<---- Indirizzo 100
<---- Indirizzo 101
<---- Indirizzo 110
<---- Indirizzo 111
B7 B6 B5 B4 B3 B2 B1 B0
I REGISTRI
Scomparto n. 3 del cassetto 011
Banco = cassettiera
<---- cassetto 000
<---- cassetto 001
<---- cassetto 010
<---- cassetto 011
<---- cassetto 100
<---- cassetto 101
<---- cassetto 110
<---- cassetto 111
scomparto
scomparto
n.7
n.0
I REGISTRI
bit n. 3 del registro di indirizzo 011
Banco (di registri)
<---- 000
<----
001
<----
010
<----
011
<---- 100
<----
101
<----
110
<---- 111
bit
bit
n.7
n.0
I REGISTRI
Le operazioni che si possono fare sui registri sono semplici, facciamo alcuni
esempi di istruzioni :
- poni nel registro di indirizzo 110 tutti i bit a zero (azzera il registro 110)
<---- Indirizzo 000
<---- Indirizzo 001
<---- Indirizzo 010
<---- Indirizzo 011
<---- Indirizzo 100
<---- Indirizzo 101
0
0
0
0
0
0
0
0
<---- Indirizzo 110
<---- Indirizzo 111
B7 B6 B5 B4 B3 B2 B1 B0
I REGISTRI
- poni nel registro di indirizzo 010 tutti i bit a uno, i valori dei bit begli altri
registri rimangono invariati
<---- Indirizzo 000
<---- Indirizzo 001
1
1
1
1
1
1
1
1
<---- Indirizzo 010
<---- Indirizzo 011
<---- Indirizzo 100
<---- Indirizzo 101
<---- Indirizzo 110
<---- Indirizzo 111
B7 B6 B5 B4 B3 B2 B1 B0
I REGISTRI
- poni nel registro di indirizzo 010 il bit 3 uno, i valori dei bit negli altri registri
rimangono invariati
<---- Indirizzo 000
<---- Indirizzo 001
x
x
x
x
1
x
x
x
<---- Indirizzo 010
<---- Indirizzo 011
<---- Indirizzo 100
<---- Indirizzo 101
<---- Indirizzo 110
<---- Indirizzo 111
B7 B6 B5 B4 B3 B2 B1 B0
I REGISTRI
- poni nel registro di indirizzo 010 la stringa binaria 10010111b, oppure poni il
151d , oppure 97h
<---- Indirizzo 000
<---- Indirizzo 001
1
0
0
1
0
1
1
1
<---- Indirizzo 010
<---- Indirizzo 011
<---- Indirizzo 100
<---- Indirizzo 101
<---- Indirizzo 110
<---- Indirizzo 111
B7 B6 B5 B4 B3 B2 B1 B0
I REGISTRI
La stringa binaria può essere espressa come numero decimale ma è meglio
esprimerla come numero esadecimale:
- poni nel registro di indirizzo 010 il numero 255 o equivalentemente il numero
FFh,
<---- Indirizzo 000
<---- Indirizzo 001
1
1
1
1
1
1
1
1
<---- Indirizzo 010
<---- Indirizzo 011
<---- Indirizzo 100
<---- Indirizzo 101
<---- Indirizzo 110
<---- Indirizzo 111
B7 B6 B5 B4 B3 B2 B1 B0
I REGISTRI
Altro tipo di operazione è il trasferimento tra registri:
- copia il contenuto del registro di indirizzo 010 nel registro 110
<---- Indirizzo 000
<---- Indirizzo 001
1
0
1
1
0
1
1
1
<---- Indirizzo 010
<---- Indirizzo 011
<---- Indirizzo 100
<---- Indirizzo 101
1
0
1
1
0
1
1
1
<---- Indirizzo 110
<---- Indirizzo 111
B7 B6 B5 B4 B3 B2 B1 B0
I REGISTRI
Altro tipo di operazione è l’operazione aritmetico o logica tra registri:
- somma il contenuto del registro di indirizzo 010 con quello del registro 011
<---- Indirizzo 000
<---- Indirizzo 001
0
0
0
1
1
0
1
1
0
0
1
0
1
0
1
0
<---- Indirizzo 010
<---- Indirizzo 011
<---- Indirizzo 100
<---- Indirizzo 101
<---- Indirizzo 110
<---- Indirizzo 111
L’operazione viene svolta da un circuito interno che si chiama ALU e da
1 0
0
0 0 1
1 1
I REGISTRI
Le operazioni aritmetiche come la somma richiedono l’utilizzo di un registro
particolare che si chiama ACCUMULATORE di cui parleremo in seguito, in
poche parole un dato (ex quello dell’indirizzo 011) ed il risultato devono
transitare per l’accumulatore.
<---- Indirizzo 000
<---- Indirizzo 001
0
0
1
1
0
1
1
1
0
1
0
1
0
0
0
0
<---- Indirizzo 010
<---- Indirizzo 011 (va posto nell’ACC.)
<---- Indirizzo 100
<---- Indirizzo 101
<---- Indirizzo 110
<---- Indirizzo 111
L’operazione viene svolta da un circuito interno che si chiama ALU e da
1 0
0
0 0 1
1 1 (va nell’ACCUMULATORE)
I REGISTRI
Cosa contengono i registri? I registri contengono stringhe binarie.
Le stringhe binarie possono rappresentare due cose concettualmente
completamente molto diverse:
- possono rappresentare un NUMERO in codifica binaria (un dato numerico)
- possono rappresentare un comando per il microprocessore e cioè UNA
ISTRUZIONE
Ad esempio la stringa seguente può rappresentare il numero 129 oppure un
comando (ad esempio “ferma il programma”)
1
0
0
0
0
0
0
1
<---- Indirizzo 000
ARCHITETTURA DI UN MICROPROCESSORE
Fondamentale per l’esecuzione di un programma è un registro chiamato
PROGRAM COUNTER (PC). Questo registro contiene sempre un indirizzo.
Questo indirizzo è quello della prossima istruzione che il processore eseguirà.
All’accensione della CPU in questo registro viene a trovarsi l’indirizzo della
prima istruzione che dovrà essere eseguita chiamata istruzione di START.
ESECUZIONE DI UNA ISTRUZIONE: FASE DI FETCH
Per eseguire l’istruzione il contenuto del PROGRAM COUNTER viene copiato
nel ADDRESS REGISTER (registro indirizzo istruzioni).
L’unità di controllo pone il contenuto dell’address register del address bus e va
a leggere il valore nella locazione di memoria indirizzata. Mette poi il dato letto
dalla locazione nel data bus.
Il valore del data bus viene inserito nell’istruction register IR (registro
istruzioni). A questo punto abbiamo la decodifica dell’istruzione e la sua
esecuzione. Tutto quello elencato sopra viene chiamato FETCH dell’istruzione
e viene ripetuto per ogni istruzione
FETCH
La fase di FETCH di un’istruzione consiste quindi nelle seguenti fasi:
1) porre il valore del PROGRAM COUNTER (P.C.) nel MEMORY
ADDRESS REGISTER (M.A.R.)
2) porre il contenuto del M.A.R. nel ADDRESS BUS (A.B.)
3) prelevare il dato dalla cella indirizzata e porlo nel DATA BUS (D.B.)
4) porre il valore del DATA BUS nel INSTRUCTION REGISTER (I.R.)
ESECUZIONE DI UNA ISTRUZIONE: FASE DI DECODE
La fase di DECODE di un’istruzione consiste nel:
1) decodificare l’istruzione presente nell’I.R.
2) eseguirla
In base al contenuto presente nell’I.R. la CPU provvederà a effettuare delle
operazioni determinate da un microcodice caratteristico di ciascuna CPU ed in
maniera trasparente al programmatore.
FASE DI EXECUTE
Dopo che l’istruzione viene decodificata in base al microcodice presente
all’interno di un microprocessore questo provvede ad eseguirla (FASE DI
EXECUTE). L’esecuzione dell’istruzione dipende dal tipo di istruzione. Le
istruzioni possono essere distinte in
1) trasferimento dati tra memoria e registri o viceversa
2) operazioni aritmetiche o logiche
3) manipolazione dei bit presenti nei registri interni alla CPU (clear, set,
rotazione …)
4) manipolazione del registro contatore di programma (P.C.) per eseguire
istruzioni di salto o cicli.
5) gestione dei dispositivi di I/O
EXECUTE
Alla fine della fase di execute viene incrementato il P.C. per leggere la prossima
istruzione in base alla lunghezza dell’istruzione precedentemente eseguita.
RISC E CISC
Le CPU si distinguono in RISC cioè CPU che hanno un numero (set) ridotto di
istruzioni, e CISC che hanno un set più completo d’istruzioni. Le CPU di tipo
RISC eseguono però molto velocemente le poche operazioni ma sono più
difficili da programmare.
CICLI TEMPORALI
In base a quanto detto in precedenza la CPU per l’esecuzione di un’istruzione
semplice esegue le tre fasi:
1) fase di fetch/decode (che avvengono contemporaneamente)
2) fase di execute
Ogni fase viene chiamata ciclo macchina la cui durata è misurata in colpi di
clock.
Non sempre l’esecuzione di un’istruzione si completa con una sola fase di
fetch/decode ed una di esecute ma talvolta sono necessarie più fetch/decode
prima della fase di execute.
REGISTRI INTERNI ALLA CPU
Vediamo meglio i più importanti registri interni alla CPU:
Il contatore di programma P.C. (program counter): tale registro contiene
l’indirizzo della prossima istruzione da prelevare ed eseguire. Il valore
contenuto in questo registro viene inizializzato con un valore ben preciso in
seguito all’accensione del dispositivo. In seguito viene automaticamante
incrementato dalla fase di execute in base alla lunghezza dell’istruzione se il
programma prosegue in sequenza o viene forzato ad un valore diverso in
seguito ad un’istruzione di salto che modifica il flusso normale del programma.
REGISTRI INTERNI ALLA CPU
Il registro istruzioni I.R. (instruction register): In tale registro viene caricata
l’istruzione prelevata dalla memoria. In particolare questo registro conterrà
quella parte dell’istruzione che si chiama codice operativo (op-code) che è una
parte dell’istruzione completa. L’altra parte dell’istruzione sono ad esempio gli
indirizzi dei dati da trattare o i valori dei dati.
REGISTRI INTERNI ALLA CPU
Il registro indirizzi di memoria M.A.R. (memory address register): Tale
registro contiene l’indirizzo da porre nell’address bus per effettuare una lettura
o una scrittura dalla memoria.
Durante la fase di prelievo dell’istruzione da eseguire (fetch) in tale registro
viene copiato il contenuto del P.C.
Questo registro può essere usato anche durante l’esecuzione dell’esecuzione
(execute) quando sono necessarie delle letture o scritture dei dati in memoria.
In questo caso vi verrà copiato l’indirizzo della cella in questione
REGISTRI INTERNI ALLA CPU
Il registro dati di memoria M.D.R. (memory data register): Tale registro
contiene il dato da porre nel data bus per effettuare scrittura nella memoria o
contiene il dato letto dalla memoria.
Questo è un registro bidirezionale in quanto contiene i dati da mettere nel data
bus oppure contiene i dati prelevati dal data bus.
REGISTRI INTERNI ALLA CPU
Il registro di stato S.R. (status register): Tale registro contiene un certo numero
di bit chiamati flag (bandierine) che si alzano e si abbassano (cioè vanno a zero
o ad 1) a seconda del verificarsi di certi eventi.
Gli eventi che vengono controllati nel registro di stato variano da processore a
processore ma in generale questi sono:
1) eventi interni al microprocessore.
2) eventi esterni al microprocessore
REGISTRI INTERNI ALLA CPU
Il registro di stato S.R. (status register):
1) eventi interni al microprocessore.
Gli eventi interni al microprocessore sono quelli legati ai risultati delle
operazioni all’interno della ALU e cioè possono essere ad esempio:
bit S (segno) indica con 0 o 1 il segno dell’ultima operazione
bit Z (zero) indica se l’ultima operazione ha dato risultato zero
bit C (carry) indica se l’ultima operazione ha dato un riporto nell’ultimo bit
cioè se nella rappresentazione del risultato è avanzato un 1 (vale
anche per le operazioni di scorrimento rotazione)
bit H (half carry) stessa cosa valutata a metà parola
bit O (overflow) segnala il superamento della capacità del regitro in una
somma nelle rappresentazioni dei numeri con complemento a 2
bit P (parity) indica se il risultato è pari o dispari
bit < (minore) indica se la word A è minore della word B
REGISTRI INTERNI ALLA CPU
Il registro di stato S.R. (status register):
2) eventi esterni al microprocessore
Il bit di interruzione merita un discorso a parte. Tale discorso verrà fatto in
seguito parlando in generale di interruzione (o interrupt) di un
microprocessore. Per ora solo un breve cenno.
Un microprocessore elabora dati che provengono dall’esterno e quindi ha la
necessità di colloquare con il mondo esterno. Una tecnica di colloquio con il
mondo esterno è la tecnica dell’interruzione.
Se vogliamo che il microprocessore risponda immediatamente alle richieste di
interruzioni esterne poniamo il bit a 0 altrimenti se richiediamo che il
microprocessore non debba essere disturbato da interruzioni esterne poniamo il
bit a zero.
REGISTRI INTERNI ALLA CPU
Il registro puntatore di stack S.P. (stack pointer):
Lo stack (catasta) è una particolare area di memoria di tipo LIFO (last in fist
out) e cioè il l’ultimo dato messo sarà il primo da leggere.
Il registro puntatore di stack contiene l’indirizzo della prima locazione libera da
utilizzare se voglio inserire un dato in questo stack.
Al momento che inserisco un dato il registro puntatore di stack si incrementa,
se leggo un dato allora il puntatore di stack si decrementa.
Esempio: supponiamo che lo stack sia formato da 5 celle di indirizzo da 1000 a
1004. Inizialmente lo stack punta la cella 1000 che è vuota. Se inserisco un
dato lo metto nella cella 1000 ed il registro di stack punta 1001. Se inserisco un
secondo dato lo metto nella cella 1001 ed il puntatore punterà a 1002. Se
prelevo un dato allora leggerò quello presente in 1001 ed il puntatore punterà
ora questo indirizzo ritenendolo vuoto.
L’inserimento di un dato si chiama PUSH, il prelievo si chiama POP.
L’utilizzo di tale registro è importante nell’esecuzione dei sottoprogrammi.
REGISTRI INTERNI ALLA CPU
Altri registri:
All’interno dei vari microprocessori sono presenti altri registri il cui numero ed
utilizzo varia molto tra i vari modelli.
Quello più importante e sempre presente è l’ACCUMULATORE, un registro
che è direttamente connesso con l’ALU e dove viene copiato il risultato delle
operazioni.
Oltre ad esso vi sono altri registri di lavoro utilizzabili per le operazioni, per il
trasferimento dati da e per la memoria e per la gestione delle interruzioni.
LE ISTRUZIONI
Il processo di eleborazione della CPU è determinato dalle istruzioni depositate
in locazioni successive di memoria in codice binario, o come si dice, in codice
macchina. Il contenuto informativo delle istruzioni riguarda:
1) l’operazione (codice operativo) che la CPU deve eseguire (somma,
trasferimento di un dato, confronto tra dati …)
2) il valore dei dati (operandi) o le indicazioni per il reperimento degli stessi
(indirizzamento dei dati)
Sia il codice operativo che gli operandi sono codificati in binario. Il
programmatore che realizza il programma deve scrivere questa
rappresentazione binaria ma la ricava con l’ausilio di programmi chiamati
“assemblatori” che elaborano automaticamente un listato scritto in linguaggio
più evoluto chiamato assembler. Questo sta in un rapporto 1 a 1 con le
istruzioni binarie.
LE ISTRUZIONI
In base al codice operativo si possono distinguere i seguenti tipi di istruzioni:
1) aritmetiche e logiche: operare su due dati e mettere il risultato in un
registro ben preciso (spesso nell’accumulatore)
2) rotazione o scorrimento
3) manipolazione di singoli bit di un registro (settaggio, resettaggio ….)
4) controllo del programma: modificare il contenuto del P.C. per variare il
flusso del programma. Sono le istruzioni di salto o di
chiamata a sottoprogramma e ritorno da sottoprogramma.
5) controllo della CPU: start, arresto, modifica dei flag nel registro di stato.
LE ISTRUZIONI
In base al tipo di indirizzamento dei dati si possono distinguere i seguenti casi:
1) immediato
: il dato è presente assieme all’istruzione
2) diretto
: nell’istruzione è presente l’indirizzo del dato
3) diretto da registro : nell’istruzione è indicato il registro entro il quale è
contenuto il dato
4) indiretto da registro: nell’istruzione è indicato il registro entro il quale è
contenuto l’indirizzo del dato
5) relativo
: salto di celle dove trovare il dato
6) indicizzato
: il registro contiene l’indirizzo della cella dove c’è l’indirizzo
del dato.
LE ISTRUZIONI
Il programma da eseguire ed i dati risiedono in memoria. In base a quanto detto in
precedenza sia il codice operativo delle istruzione e sia i dati da elaborare o gli
indirizzi dei dati sono espressi in binario e così devono essere caricati in memoria
prima dell’esecuzione. Siccome non è estremamente scomodo scrivere direttamente
in binario si ricorre ad un linguaggio simbolico chiamato assembly che è fatto non
di bit ma di codici mnemonici più facili quindi da ricordare, ma che sono in un
rapporto 1 a 1 con le istruzioni binarie. Provvederà un particolare programma
chiamato “assemblatore” che trasformerà il programma assembly in un codice
binario.
Per programmare un microprocessore occorrerà conoscere le istruzioni nel
linguaggio assembly. Il linguaggio assembly varia da processore a processore anche
se i concetti di base rimangono sempre gli stessi.
Verrà affrontato in seguito il linguaggio assembly di un microcontrollore PIC.
Per ora affrontiamo delle problematiche di base comuni a tutti i micro.
LE ISTRUZIONI
Istruzioni di elaborazione dati del tipo:
1) somma (ADD) o sottrai il contenuto di due registri
2) operazioni logiche AND, OR … tra due registri
3) incrementa (INC) , decrementa (DEC), ruota (ROT) il contenuto di un registro
4) compara (COMP) il contenuto di due registri
Istruzioni di controllo del tipo:
1) salta ad una istruzione (GOTO)
2) salta ad un sottoprogramma (CALL)
3) ritorna da un sottoprogramma (RETURN)
Istruzioni di trasferimento tra registri interni e collegamento con la memoria
1) sposta (MOV) un dato da un registro ad un altro registro
2) sposta (MOV) un dato dal registro ad una cella di memoria o viceversa
Collegamento in lettura e scrittura con dispositivi esterni alla CPU
1) leggi e scrivi su un dispositivo esterno (IN ed OUT)
LE ISTRUZIONI
Collegamento con le memorie:
I microprocessori hanno dei piedini esterni che permettono una connessione
diretta alle memorie esterne di tipo ROM e SRAM.
I segnali di controllo utilizzati a questo scopo sono:
RD : read
WR : write
MREQ : memory request
da collegare ai corrispondenti piedini presenti nei banchi di memoria
LE ISTRUZIONI
Collegamento con dispositivi di ingresso ed uscita (I/O):
Con la sigla I/O si identificano in maniera generica tutti i dispositivi che possono
scambiare dati con un microprocessore. I dispositivi sono molto diversi tra loro e
per questo motivo hanno bisogno di un dispositivo di adattamento chiamato
INTERFACCIA.
Il microprocessore si occuperà solamente di scambiare dati con l’interfaccia che a
sua volta si preoccuperà di trasformare i segnali provenienti dall’esterno in
segnali standard per il microprocessore.
Un’interfaccia deve provvedere quindi a:
gestire i segnali di controllo
immagazzinare i dati
separare elettricamente
LE ISTRUZIONI
Collegamento con dispositivi di ingresso ed uscita (I/O):
I dispositivi esterni possono essere indirizzati dalla CPU in due maniere
differenti:
- come se fossero celle di memoria RAM (indirizzamento mappato in memoria o
memory mapped). In questo caso è compito del progettista generare
dall’indirizzo del dispositivo un segnale di chip-select distinto per ogni interfaccia
indirizzamento di I/O distinto: in questo caso si attiva un segnale specifico
chiamato IOREQ (input/output request) che può essere utilizzato per selezionare
il dispositivo esterno. Nel caso precedente si attivava il piedino MREQ (memory
request e veniva occupato spazio della memoria indirizzabile)
MODALITA’ DI SCAMBIO DATI TRA CPU E PERIFERICHE
Quando si devono scambiare dati tra CPU e periferiche possiamo avere tre
situazioni diverse:
1) una stessa periferica deve essere condivisa da più processori senza conflitti
2) la periferica è troppo lenta (o troppo veloce) per i tempi della CPU
3) occorre gestire le periferiche con una priorità diversa
Le soluzioni sono di tre tipi:
1) Trasferimento programmato (chiamato anche I/O diretto)
2) trasferimento pilotato da interruzione (chiamato interrupt)
3) tecnica di accesso diretto alla memoria (o DMA)
TRASFERIMENTO PROGRAMMATO:
Il trasferimento programmato (I/O diretto) è un tipo di trasferimento iniziato ed
effettuato sotto la diretta ed incondizionata gestione della CPU. Nello specifico la
tecnica usata è chiamata HANDSHAKE e cioè stretta di mano. Il dispositivo
esterno ha un flag che prende il significato di bit di READY (pronto) che viene
attivato dalla periferica quando è pronta a colloquiare. Se la CPU trova attivo il
bit READY disattiva il bit e trasferisce il dato in modo che nessun altro possa
accedere alla periferica. Si pone poi in attesa (wait) ed aspetta che la periferica
abbia completato il trasferimento.
Se vi sono più periferiche da gestire la CPU può adottare la tecnica del POLLING
e cioè della verifica ciclica dello stato di richiesta servizio delle varie periferiche
che quando hanno eseguito l’operazione precedente attivano il bit READY.
TRASFERIMENTO PILOTATO DA INTERRUZIONE:
Il trasferimento pilotato da interruzione (interrupt) è un tipo di trasferimento
iniziato dal dispositivo. E’ il dispositivo esterno che invia alla CPU una richiesta
di comunicazione, attivando una specifica linea della CPU chiamata IRQ o
INTREQ .
L’interruzione è cioè un processo mediante il quale il mondo esterno può
richiedere alla CPU di interrompere il programma in corso per eseguire una
determinata procedura.
Gli utilizzi di questa tecnica sono ad esempio: la tastiera che chiede di trasmettere
un dato, un convertitore che dichiara di aver pronto il dato etc..
Le segnalazioni di richiesta di interruzione vanno ad attivare un segnale di IRQ
sulla CPU che provvederà a gestire tali interruzioni mandando in esecuzione un
opportuno programma.
La rivelazione delle richieste di interruzione e la loro gestione varia da processore
a processore per cui vedremo meglio per il PIC
TRASFERIMENTO CON TECNICA DMA:
Il trasferimento con tecnica DMA consente l’accesso diretto alla memoria per il
trasferimento dati da e verso le unità periferiche senza passare per la CPU. Il
trasferimento è gestito dall’interfaccia del dispositivo esterno che richiede la
sospensione delle attività della CPU per assumere il controllo del bus. Questa
tecnica si rivela molto adatta per il trasferimento di molti dati con periferiche
veloci.
GESTIONE DELLE INTERRUZIONI:
Il colloquio tra periferica e CPU tramite la tecnica dell’interruzione ha delle
caratteristiche che dipendono dal processore.
Innanzitutto occorre dire che la CPU in risposta ad una richiesta d’interruzione
deve mandare in esecuzione una routine di servizio interrompendo (da cui il
nome) il programma precedentemente in esecuzione normale.
Pertanto, all’insorgere di una richiesta d’interruzione, la CPU deve solo
completare l’istruzione in corso e procedere all’esecuzione di una routine di
gestione dell’interruzione.
La CPU deve cioè provvedere a:
1) salvare il contesto (context saving) in una memoria a catasta LIFO (stack)
2) mettere nel PC l’indirizzo della prima istruzione della routine di gestione
A gestione dell’interruzione completata (RETURN) la CPU provvederà a
ripristinare il contesto (context restore) prelevando in ordine inverso i dati dallo
stack. E’ da notare che sono possibili gestione di interruzioni nidificate.
GESTIONE DELLE INTERRUZIONI:
Analizziamo ora certe problematiche comuni connessi alla gestione delle
interruzioni che sono:
1) il riconoscimento da parte della CPU di una richiesta d’interruzione
2) la modalità con cui la CPU può individuare quale delle periferiche connesse ha
generato l’interruzione al fine di localizzare in memoria la routine di servizio
(ISR: interrupt routine service) corrispondente
3) la valutazione dei livelli di priorità delle interruzioni ossia la possibilità di
stabilire , nel caso vi siano più richieste, contemporanee quale debba essere
servita per prima.
Riconoscimento da parte della CPU di una richiesta d’interruzione ed
individuazione del richiedente
Per la richiesta d’interruzione la CPU presenta delle linee che sono chiamate IRQ
e NMI che possono essere connesse assieme tramite una OR logica.
La CPU una volta accettata la richiesta di interruzione andrà a leggere il bit di
stato di tutte le periferiche collegate e scoprirà quale di esse ha richiesto
l’interruzione. A seconda della periferica richiedente manderà in esecuzione
l’opportuno programma di gestione. E’ importante che la richiesta di interruzione
rimanga attiva fino a che la CPU non ha individuato il richiedente.
Un metodo semplice per individuare il richiedente è l’interrogazione ciclica del
bit di stato (POLLING).
Un altro metodo è quello di far depositare dalla periferica richiedente nel bus dei
dati un indirizzo, l’indirizzo dove mettere la prima istruzione di gestione
dell’interruzione (TECNICA DELLE INTERRUZIONI VETTORIZZATE).
E’ importante che fino a che la CPU non ha individuato il richiedente non si abbia
una ulteriore richiesta da un’altra periferica.
Gestione delle priorità
Gli eventi esterni di richiesta d’interruzione si verificano in modo casuale ed
asincrono e può capitare il caso in cui più periferiche richiedano
contemporaneamente il servizio.
In questo caso bisogna che il processore individui quale richiesta deve essere
soddisfatta per prima mentre le richieste degli altri deve essere ritardata.
Questo può essere ottenuto in maniera software effettuando un pollig tale che le
periferiche con maggior priorità siano testate per prime, o in maniera hardware
utilizzando particolari circuiti o particolari strutture (daisy-chain)
Scarica

FILE