5
Introduzione
L‘obiettivo del presente elaborato è di ―raccontare‖ il percorso storico che ha portato, in
seguito allo sviluppo tecnologico (soprattutto relativo all‘implementazione di nuove
soluzioni architetturali dei processori), dal processore MC68000 dell‘azienda statunitense
Motorola, comparso sul mercato alla fine degli anni ‘70, ai microcontrollori della famiglia
ColdFire della Freescale Semiconductor (società subentrata a Motorola).
Nel primo capitolo saranno fatti alcuni cenni storici sulla famiglia MC680X0 (famiglia di
processori della Motorola), relativi all‘evoluzione dal capostipite (il processore MC68000)
fino al processore MC68060 (l‘ultimo membro della famiglia a essere commercializzato
come processore per uso generico).
Nel secondo capitolo ci sarà una breve presentazione della famiglia di microcontrollori
683XX della Motorola, relativa soprattutto alle caratteristiche architetturali comuni dei
membri di tale famiglia. Poi verrà esaminato, in particolare, il microcontrollore MC68332, il
membro più interessante della famiglia MC683XX.
Il terzo capitolo conterrà brevi cenni storici riguardanti la famiglia ColdFire della Freescale
Semiconductor e saranno velocemente presentati i suoi principali membri.
Il quarto e ultimo capitolo sarà dedicato all‘esame delle principali differenze (soprattutto a
livello di architettura) tra un microcontrollore Motorola ed uno della famiglia ColdFire.
6
Capitolo 1
Storia della famiglia di processori MC680X0
Nel capitolo verranno fatti alcuni cenni storici riguardanti la famiglia di processori
MC680X0 della Motorola.
I suddetti cenni inizieranno con una presentazione concisa del processore MC68000 della
Motorola, proseguiranno con una breve presentazione dei principali membri della famiglia
680X0 di processori della Motorola (per la precisione, dei processori MC68020, MC68030,
MC68040, MC68060), e si concluderanno con un riepilogo delle loro principali differenze.
1.1 Il processore MC68000
Il processore MC68000 della Motorola è stato posto sul mercato nel 1979 ed è il capostipite
di due famiglie di processori prodotti da Motorola negli anni ‘80 e ‗90.
Inoltre, è stato il primo processore a 32 bit di Motorola capace di eseguire due milioni di
calcoli al secondo.
Esso è basato su un‘architettura a registri generali, quasi ortogonale.
Il modello di programmazione del processore MC68000 è costituito da otto registri di dato
(denotati con D0, D1, …, D7), da otto registri di indirizzo (denotati con A0, A1, …, A7). Il
registro di indirizzo A7 svolge il ruolo di stack pointer nel modo utente (USP); in realtà,
esiste anche un registro di indirizzo A7‘ che svolge il ruolo di stack pointer nel modo di
sistema (SSP). A completare il suddetto modello ci sono, poi, il registro PC (Program
counter) e il registro di stato, SR, il cui byte meno significativo è detto registro dei codici di
condizione (CCR).
I registri di dato, quelli di indirizzo e il registro PC sono tutti di 32 bit mentre il registro di
stato è di 16 bit.
7
Da un punto di vista esterno, il processore MC68000 ha una lunghezza di parola uguale a
16 bit, in quanto il chip che lo ospita ha 16 piedini per il collegamento alla memoria. Invece,
internamente al processore, i dati vengono elaborati a 32 bit.
Essendo uguale a 24 bit il parallelismo del bus indirizzi ed uguale a 32 bit la dimensione dei
registri di indirizzo e del registro PC, nel processore MC68000 si ha che lo spazio di
indirizzamento fisico è diverso dallo spazio di indirizzamento logico (16 MB vs 4 GB). Da
ciò può generarsi il fenomeno denominato aliasing degli indirizzi: due indirizzi contenuti in
un registro di indirizzo o nel registro PC, che differiscano solo per gli otto bit più
significativi, attivano la stessa locazione fisica di memoria.
L‘unità di memoria collegabile al processore MC68000 è indirizzabile a byte, cioè, in essa,
la più piccola quantità di memoria singolarmente indirizzabile è il byte.
Il processore MC68000 possiede istruzioni macchina la cui lunghezza può variare da un
minimo di una a un massimo di cinque parole. Nella prima sono contenuti, in sostanza, il
codice operativo e il modo di indirizzamento mentre nelle successive parole sono contenuti,
in base al modo di indirizzamento, l‘operando in modo immediato e/o gli indirizzi di
operandi indirizzati in modo diretto di memoria.
I modi di indirizzamento del processore MC68000 sono i seguenti:
Modo diretto di registro di dato;
Modo diretto di registro di indirizzo;
Modo indiretto attraverso registro di indirizzo;
Modo indiretto con postincremento;
Modo indiretto con predecremento;
Modo indiretto con displacement (detto anche based);
Modo indiretto con displacement e indice;
Modo diretto di memoria (detto anche assoluto)
8
Modo relativo a PC;
Modo relativo a PC con indice;
Modo immediato.
Il linguaggio assemblativo del processore MC68000 è sinteticamente indicato con ASM68K
ed è valido per l‘intera famiglia di processori MC680X0 della Motorola. L‘ASM68K è
simile ad un linguaggio assemblativo generico (cioè relativo a un processore astratto);
questo è il motivo per cui è spesso utilizzato nell‘ambito didattico.
Tra gli aspetti più importanti dell‘ASM68K ci sono i seguenti:
1. Le istruzioni assembler di salto incondizionato possono essere sia assolute sia
relative (esse hanno, rispettivamente, codice mnemonico JMP e BRA), quelle di
salto condizionato si basano solo sull‘analisi dei flags del CCR e possono essere
solo relative (il loro codice mnemonico è del tipo Bcc, dove cc specifica il valore
del CCR, è espresso da una sigla che richiama il significato della condizione da
testare e viene posizionato di solito da un‘istruzione assembler di comparazione,
CMP, che precede quella di salto);
2. La questione dello scambio (o passaggio) dei parametri tra programma chiamante e
sottoprogramma chiamato, forse la più importante del collegamento tra
sottoprogrammi, è gestita (oltre che mediante i registri generali) mediante l‘utilizzo
dello stack di sistema. In tale tecnica, è previsto l‘utilizzo di un‘area di memoria
allocata dinamicamente e in cui vengono, sostanzialmente, memorizzati il valore
del registro PC che permette il ritorno da sottoprogramma, i parametri effettivi e le
variabili locali del sottoprogramma. Tale area di memoria è detta record di
attivazione. Tale record è una sorta di spazio di lavoro privato del sottoprogramma
chiamato, che è creato all‘attivazione del sottoprogramma e che viene eliminato
quando quest‘ultimo termina. Esso viene memorizzato nello stack di sistema, in
maniera tale che la sua ―cima‖ sia coincidente con quella dello stack. I diversi
campi del record di attivazione vengono indirizzati con opportuni spiazzamenti
costanti rispetto al registro FP (frame pointer, puntatore al record di attivazione), il
quale è un registro del processore in cui viene memorizzato l‘indirizzo della cima
9
dello stack di sistema nell‘istante in cui entra in uso (nonostante non sia ancora del
tutto costruito) il record di attivazione del sottoprogramma chiamato. Si noti che il
registro FP ha contenuto costante per tutta la durata dell‘esecuzione del
sottoprogramma. L‘ASM68K possiede due apposite istruzioni assembler che
agevolano la gestione del record di attivazione sullo stack di sistema: LINK e
UNLK.
Nel processore MC68000 il meccanismo di gestione delle interruzioni (nel senso di
interruzioni hardware) è basato sul concetto di priorità.
In generale, ad ogni richiesta di interruzione di un dispositivo si associa un livello di
priorità; fatto ciò, quando il processore ha in corso il servizio di una richiesta di
interruzione, esso accetta e serve subito una richiesta di interruzione appena arrivata solo
se questa ha un livello di priorità superiore. Il livello di priorità dell‘interruzione
correntemente in esecuzione è detto livello di priorità corrente. Esiste, inoltre, un livello
di priorità non mascherabile, cioè avente precedenza assoluta su tutti gli altri livelli di
priorità.
Il processore MC68000 ammette otto livelli di priorità, da 0 a 7; il livello di priorità
corrente è codificato da tre bit di SR (i bit nelle posizioni 8, 9, 10 di SR), il livello 7 è
quello di priorità non mascherabile. Il processore MC68000 risolve il problema
dell‘identificazione del dispositivo richiedente interruzione con due soluzioni:
Meccanismo di interruzione vettorizzata;
Meccanismo di interruzione autovettorizzata.
Ambedue fanno uso della tabella delle interruzioni. Quest‘ultima è una tabella, residente
in memoria, costituita da una sequenza di elementi detti vettori di interruzione (ciascuno
di essi rappresenta l‘indirizzo iniziale di una ISR – tale acronimo sta per sottoprogramma
di servizio di un‘interruzione).
Nel meccanismo di interruzione vettorizzata del 68000, un dispositivo richiedente
interruzione manda al processore un codice identificativo di 8 bit in risposta al segnale di