Lezione 16
Lezione 16
Sommario
•
•
•
•
•
Materiale di riferimento
1. Datasheet del microcontrollore Philips LPC2129,
disponibile sul sito web del corso in formato
pdf.
Il processore ARM7
Introduzione al mC Philips LP2129
Sistema di sviluppo e simulatore
Periferiche fondamentali
Il sistema di sviluppo uVision 3
Simone Buso - Microcontrollori e DSP - Lezione 16
2. Manuale di uso del microcontrollore Philips
LPC2129, disponibile sul sito web del corso in
formato pdf.
3. Simulatore del processore ARM7, disponibile sul
sito del corso.
4. A. Clements, "The principles of computer
hardware", Oxford, 2000, cap. 7, pagg. 369399.
1
Simone Buso - Microcontrollori e DSP - Lezione 16
2
Il processore ARM7
Il processore ARM7
L’ARM7 è un processore RISC a 16/32 bit,
prodotto, a partire dal 1993, dalla “Advanced
Risc Machines Ltd.” che ha sede nel sud-est
dell’Inghilterra (Cambridge).
È disponibile in una ampia gamma di versioni,
dedicate principalmente ad applicazioni di tipo
“embedded”.
Tra queste, ci sono numerosi mC prodotti da
almeno 10 diversi costruttori tra i quali STM,
Motorola, NEC, Atmel, Philips, Sharp, TI.
Il processore adotta la filosofia RISC in modo
rigoroso: tutte le istruzioni del suo assembly
hanno una lunghezza di parola costante pari a
32 bit.
In alcune versioni del processore però, per
ottenere codice più compatto, si può ricorrere
ad un set di istruzioni ridotto a 16 bit, detto
“Thumb”, che comporta una certa riduzione
delle prestazioni ottenibili.
È inoltre possibile passare da una modalità
all’altra anche all’interno dello stesso codice.
Si tratta quindi di un vero e proprio standard
industriale.
Simone Buso - Microcontrollori e DSP - Lezione 16
3
Simone Buso - Microcontrollori e DSP - Lezione 16
Il processore ARM7
Il processore ARM7
Per quanto riguarda l’organizzazione, l’ARM7
è un processore basato sulla filosofia Von
Neumann, quindi con una singola memoria e un
solo sistema di bus per istruzioni e dati
(nasce come processore “general purpose”).
Thumb
Tuttavia, questa organizzazione è supportata
da una CPU a molti registri, che limita il
numero di accessi alla memoria. Di fatto, solo
3 istruzioni (LDR,STR e SWP e loro varianti)
possono accedere alla memoria.
Infine, il processore usa una pipeline a 3
stadi: fetch, decode e execute.
Simone Buso - Microcontrollori e DSP - Lezione 16
4
5
Fetch
PC
PC
PC+4
PC+2
Decode
PC+8
PC+4
Execute
Simone Buso - Microcontrollori e DSP - Lezione 16
L’istruzione è
prelevata dalla
memoria …
… i registri usati
dall’istruzione sono
identificati …
… i registri vengono
letti, eseguite le
operazioni ALU e
shift, vengono scritti
i risultati.
6
1
Il processore ARM7
Il processore ARM7
L’organizzazione a pipeline del processore
comporta che non sia immediato conoscere il
tempo di esecuzione, in cicli macchina, delle
varie istruzioni. Questo infatti dipende
dall’effetto delle stesse sulla pipeline.
In generale, le istruzioni che richiedono un
accesso alla memoria sono più lente.
Ad esempio, una istruzione di salto può
richiedere 3 o 4 cicli, a seconda del tipo di
salto. L’ARM7 non opera salti ritardati.
Le istruzioni aritmetiche invece richiedono di
norma 1 solo ciclo.
Simone Buso - Microcontrollori e DSP - Lezione 16
Il processore ARM7 include un circuito per la
moltiplicazione che implementa l’algoritmo di
Booth, per gestire anche i numeri con segno.
La moltiplicazione richiede quindi un tempo di
esecuzione diverso, a seconda della lunghezza
degli operandi.
In alcune versioni del processore ARM7 e
nelle sue evoluzioni successive, e.g. ARM9,
sono stati introdotti dei circuiti di
moltiplicazione a un solo ciclo (i.e. del tipo in
uso nei DSP) per migliorare le prestazioni in
ambito “signal processing”.
7
Il processore ARM7
Il linguaggio assembly del processore ARM7 si
compone di 38 istruzioni, cui si aggiungono
alcune “pseudo-istruzioni” (e.g. ADR) che
vengono espanse dall’assemblatore al momento
della creazione del codice macchina.
Tutte le istruzioni sono condizionali, ossia
vengono eseguite solo se, nel registro di stato
del processore (PSR), si verifica la condizione
precisata dal programmatore.
Per impostare una condizione basta
semplicemente aggiungere un suffisso al nome
dell’istruzione (e.g. ADD → ADDNE).
Il passaggio da un modo di funzionamento ad
un altro corrisponde ad eventi particolari
come il verificarsi di interruzioni o eccezioni.
9
Assembly del processore ARM7
Simone Buso - Microcontrollori e DSP - Lezione 16
10
Assembly del processore ARM7
Altri esempi con ADD:
Inoltre, in quasi tutte le istruzioni è possibile
includere anche uno shift preliminare del
secondo operando.
Questo può essere sia aritmetico che logico,
in entrambe le direzioni e per un numero di
bit impostabile dal programmatore.
Ad esempio l’istruzione:
ADDEQ r1, r2, r3, LSL #2;
esegue, solo se il risultato della precedente
istruzione è stato 0, le seguenti operazioni:
ADDS r1, r2, r3
[r1] ← [r2]+[r3], aggiorna
i flag
ADDEQS r1, r2, r3
se Z=1, [r1] ← [r2]+[r3],
poi aggiorna i flag
ADD r1, r2, r3, LSL r4
[r1] ← [r2]+[r3]·2
ADD r1, r2, #125
[r1] ← [r2]+125
ADD r1, r2, #0xFF00
[r1] ← [r2]+255·2
[r4]
8
L’ultimo esempio è piuttosto “criptico”: la sua
spiegazione sta nel modo particolare in cui
l’ARM7 gestisce gli operandi costanti (segue).
LSL r3 di 2 bit e, dopo, [r1] = [r2] + [r3].
Simone Buso - Microcontrollori e DSP - Lezione 16
8
Assembly del processore ARM7
Il processore ARM7 è dotato di 37 registri,
che però non sono tutti simultaneamente
visibili. Essi sono organizzati in banchi
separati, con parziale sovrapposizione.
Ad ogni banco è associato un diverso modo di
funzionamento del processore.
Nel funzionamento normale, il programmatore
dispone di 15 registri (r0-r14) più il PC (r15)
e un registro di stato (CPSR).
Simone Buso - Microcontrollori e DSP - Lezione 16
Simone Buso - Microcontrollori e DSP - Lezione 16
11
Simone Buso - Microcontrollori e DSP - Lezione 16
12
2
Assembly del processore ARM7
Assembly del processore ARM7
Il repertorio delle istruzioni include, oltre alle
operazioni fondamentali (ADD, SUB, AND,
ORR, MUL, MLA, etc.), le istruzioni di salto
(B, BL, BX, etc.) e le istruzioni per lo
spostamento dei dati (MOV, MVN, …).
L’approccio RISC con lunghezza delle istruzioni
fissa, rende però alcune operazioni meno
semplici di quanto ci si potrebbe aspettare.
Esempi molto chiari di questo fatto sono il
trattamento degli operandi costanti nelle
istruzioni aritmetiche e degli indirizzi di
memoria nelle istruzioni tipo LDR o STR.
Ci sono poi istruzioni per la manipolazione dei
bit (TST, BIC,… ) e istruzioni per la gestione
della memoria (LDR, STR, SWP).
Il fatto che la lunghezza delle istruzioni sia
fissa, ci siano sempre tre operandi e che le
operazioni di shift siano incorporate, consente
grande flessibilità.
Simone Buso - Microcontrollori e DSP - Lezione 16
La gestione di questi tipi di dato viene svolta
in modo assistito dall’assemblatore, che nella
maggior parte dei casi traduce il codice
scritto dal programmatore in un modo non
sempre intuitivo….
13
Simone Buso - Microcontrollori e DSP - Lezione 16
Assembly del processore ARM7
Assembly del processore ARM7
31
Gli operandi delle operazioni aritmetiche
possono essere solo registri o alcuni
particolari valori costanti (e.g. i numeri interi
tra 0 e 255).
Nei casi in cui si voglia utilizzare un valore
costante più grande di 255, l’ARM7 ricorre ad
una rappresentazione del dato basata su una
parte intera a 8 bit e uno shift implicito.
Questa rappresentazione privilegia il range
piuttosto che la risoluzione, che rimane quella
degli 8 bit iniziali.
Simone Buso - Microcontrollori e DSP - Lezione 16
28
cond
25
#
Op-code
S
Rn
12
shift
Aggiornamento CPSR
11
0
N.B. 2n!
Adesso si può verificare l’esempio precedente!
Simone Buso - Microcontrollori e DSP - Lezione 16
Rn
12
0
Rd
Operando_2
n
11
shift
6
Rm
3
0
Simone Buso - Microcontrollori e DSP - Lezione 16
16
Per caricare una costante qualunque in un
registro si può usare il costrutto:
LDR r0, =indirizzo
Anche in questo caso l’assemblatore, in modo
quasi trasparente, tenta di tradurre
l’istruzione in una sequenza opportuna di
MOV (con shift).
In alternativa, ricorre alla memoria per
ospitare la costante. L’unico indirizzamento
consentito, in questo caso, è quello indiretto
rispetto al PC.
Quando il bit 25 è 1, i primi 12 bit della IW
vengono interpretati come una costante, il cui
valore deve potersi esprimere come un numero
tra 0 e 255, shiftato a destra di entità 2n
(solo pari) con n compreso tra 0 e 15 ossia:
Operando_2 = N·22n
S
Assembly del processore ARM7
costante
8
16 15
20
Op-code
Quando invece il bit 25 è 0, i primi 12 bit
della IW vengono usati per contenere l’indirizzo
del terzo registro (che contiene a sua volta il
secondo operando). Inoltre, viene inserito nella
IW un codice che indica il tipo di shift e
l’entità n dello stesso. Lo shift sarà applicato
all’operando prima di eseguire l’operazione
richiesta.
Operando_2
1
#
Aggiornamento CPSR
0
Rd
25
0
15
16 15
20
28
cond
Assembly del processore ARM7
31
14
17
Simone Buso - Microcontrollori e DSP - Lezione 16
18
3
Assembly del processore ARM7
Assembly del processore ARM7
Infine l’istruzione:
ADR r0, indirizzo
serve a caricare in r0 l’indirizzo di una
posizione di memoria. Si tratta di una pseudo
istruzione che viene espansa dall’assemblatore
nella sequenza di istruzioni che realizzeranno
il risultato voluto.
In caso di ricorso alla memoria, la costante è
posizionata a valle del programma, entro 4k
byte (1k locazioni) dal punto in cui viene usata
(perché l’offset massimo per il PC è limitato a
12 bit). Altrimenti si produce un errore.
Il tempo di esecuzione delle istruzioni è
variabile. Le istruzioni di tipo aritmetico
(esclusa la moltiplicazione) richiedono di solito
un solo ciclo (che, essendo sovrapposto al
fetch dell’istruzione seguente, dura quanto un
accesso alla memoria di solito 0 wait-state).
Invece, il tempo di esecuzione di una
istruzione come:
MUL r1, r2, r3;
può richiedere da un minimo di 2 ad un
massimo di 5 cicli, a seconda degli operandi
contenuti nei registri.
Simone Buso - Microcontrollori e DSP - Lezione 16
19
Simone Buso - Microcontrollori e DSP - Lezione 16
Assembly del processore ARM7
Sistema di sviluppo ARM7
Il processore ARM7 non prevede uno stack,
quindi il salvataggio del contesto, in presenza
di una chiamata a subroutine, deve essere
fatto dal programmatore in memoria (r13=SP).
Una eccezione è rappresentata dalle routine di
servizio per le interruzioni, che dispongono di
registri riservati, che sono nuove istanze di
quelli normalmente utilizzabili.
Usando quelli, il programmatore può evitare di
salvare il contesto perché i registri della CPU
omonimi non saranno modificati durante
l’esecuzione della ISR.
La stessa ARM rende disponibile, a titolo
gratuito, un sistema di sviluppo completo per il
processore ARM7, che include assemblatore,
linker, simulatore (e compilatore C).
Il sistema permette di scrivere e testare
algoritmi per l’ARM7. Il software è disponibile
sul sito web del corso (circa 6.5 Mb).
Simone Buso - Microcontrollori e DSP - Lezione 16
Viene inoltre fornita un’ampia documentazione
sul processore e sui tool del sistema di
sviluppo, numerosi esempi di codice assembly e
C, i relativi file di tipo *.h.
21
Esempio di codice ARM7
Ciclo
Fine
A
B
MOV
MOV
ADR
ADR
LDR
LDR
MLA
SUBS
BNE
B
r4,#0
r5,#4
r0,A
r1,B
r2,[r0],#4
r3,[r1],#4
r4,r2,r3,r4
r5,r5,#1
Ciclo
Fine
;pulisco il registro che serve da accumulatore
;numero di iterazioni pari al numero di componenti di A e B
;indirizzo in memoria del primo vettore
;indirizzo secondo vettore
;prelevo A[i] e aggiorno il puntatore
;prelevo B[i] e aggiorno il puntatore
;calcolo [r4] = [r4] + [r3]*[r2]
;decremento il contatore di ciclo
;ripeto il giro
;mantengo qui il PC
DCD
DCD
DCD
0x00000001
0x00000002
0x00000003
;ciascun vettore occupa 16 byte = 4 locazioni a 32 bit
;
;
DCD
DCD
DCD
DCD
DCD
0x00000004
0x00000005
0x00000006
0x00000007
0x00000008
;
;qui inizia il vettore B
;
;
;
Simone Buso - Microcontrollori e DSP - Lezione 16
22
Esempio di codice ARM7
AREA TestProg, CODE, READONLY
ENTRY
Inizio
20
Il programma calcola il prodotto scalare di due
vettori A e B, ciascuno con 4 componenti.
Usa quindi l’istruzione MLA, che ha appunto la
funzione di prodotto e somma sull’accumulatore.
I valori iniziali dei vettori sono forniti
sfruttando l’assemblatore. Attraverso la
direttiva DCD esso carica in memoria,
all’indirizzo in cui si trova, il dato, in formato
word, specificato dal programmatore.
Naturalmente, con il debugger è poi possibile
alterare tali valori.
END
Simone Buso - Microcontrollori e DSP - Lezione 16
23
Simone Buso - Microcontrollori e DSP - Lezione 16
24
4
Il microcontrollore LP2129
Il microcontrollore LP2129
L’LP2129 è un mC Philips basato su core
ARM7. Come sempre in questi casi, il
costruttore acquista il core su licenza e
sviluppa intorno ad esso, sullo stesso chip, i
diversi circuiti necessari a trasformare un
processore per uso generico in un mC (SoC).
Questi includono, tra le altre cose, il circuito
per la vettorizzazione interna delle interruzioni
(detto “VIC”) e tutte le diverse periferiche.
L’LP2129 include numerose periferiche, che
sono:
1. convertitore A/D a 10 bit su 4 canali;
2. diversi tipi di timer a 32 bit (2 GPT, RTC,
PWM con 6 uscite, Watchdog timer);
3. 4 canali Capture e Compare;
4. 5 interfacce seriali di tipo UART, SPI e
I2C;
5. 2 porte CAN;
Ciascuna di queste è mappata in memoria e
prevede alcuni registri di configurazione.
La programmazione del mC è quindi identica a
quella dell’ARM7. In più si aggiunge la gestione
delle varie periferiche.
Simone Buso - Microcontrollori e DSP - Lezione 16
25
Periferiche LP2129
Come sappiamo, la gestione di una periferica
mappata in memoria può essere organizzata
secondo due diverse strategie:
1. polling;
2. generazione di interruzioni.
La prima strategia è concettualmente semplice
e non richiede altro che la programmazione
della periferica.
La seconda, che è assai più efficiente,
richiede, in aggiunta, una adeguata
programmazione del sistema di interruzioni del
microcontrollore.
27
Simone Buso - Microcontrollori e DSP - Lezione 16
Sistema di interruzioni LP2129
Sistema di interruzioni LP2129
La configurazione del sistema di interruzioni è
una parte piuttosto delicata dell’apprendimento
di un nuovo mC o DSP.
Risulta più complessa nel caso di dispositivi
che permettono all’utente di modificare a
piacere parametri come la priorità delle
interruzioni, l’allocazione in memoria del
vettore delle routine di servizio oppure il
metodo di arbitraggio delle IRQ simultanee.
Inoltre, i manuali d’uso forniscono informazioni
talvolta incomplete al riguardo.
Nei mC di tipo embedded core, come il nostro,
la gestione delle interruzioni è complicata dal
fatto che si appoggia al sistema di interruzioni
proprio del processore originale (i.e. ARM7).
Simone Buso - Microcontrollori e DSP - Lezione 16
26
Periferiche LP2129
Le periferiche dell’LP2129 condividono un bus,
denominato PB, che permette di trasferire il
contenuto dei registri di configurazione e i
dati prodotti da e verso la CPU.
Il clock di questo bus (pclk) è diverso dal clock
del processore (cclk). Viene ricavato da questo
per divisione di frequenza, controllata da un
apposito registro (VPBDIV).
In questo modo l’utente può decidere la
velocità di funzionamento delle periferiche in
modo flessibile rispetto al clock del processore
(ottimizzazione dei consumi).
Simone Buso - Microcontrollori e DSP - Lezione 16
Simone Buso - Microcontrollori e DSP - Lezione 16
28
Quando riceve un’interruzione, il VIC non può
far altro che attivare a sua volta una delle
due linee di interruzione dell’ARM7, che poi
gestisce la richiesta secondo la sua
programmazione originale.
In particolare, all’arrivo di una IRQ (o FIQ)
l’ARM7 carica nel PC un indirizzo di memoria,
che appartiene al suo vettore delle eccezioni.
29
Simone Buso - Microcontrollori e DSP - Lezione 16
30
5
Sistema di interruzioni LP2129
Sistema di interruzioni LP2129
L’organizzazione
del sistema di
interruzioni VIC
dell’LP2129 si
presenta
discretamente
complicata.
Per impostare il sistema di interruzioni
dell’LP2129 non è quindi sufficiente
programmare il VIC. Bisogna anche predisporre
delle istruzioni opportune (di solito di salto
verso la ISR vera e propria) nel vettore delle
eccezioni del core ARM7.
Come vedremo, questo richiede di saper usare
correttamente il linker, che è responsabile del
posizionamento in memoria del codice oggetto.
I registri di
configurazione
del servizio sono
oltre 40!
Anche questa operazione può risultare non
banale, specialmente quando non sia fornita
adeguata documentazione.
Simone Buso - Microcontrollori e DSP - Lezione 16
31
Simone Buso - Microcontrollori e DSP - Lezione 16
Sistema di interruzioni LP2129
Sistema di interruzioni LP2129
Le 32 possibili sorgenti di interruzioni sono
classificate in 3 gruppi:
a. interruzioni veloci FIQ (FIQ ARM7);
b. interruzioni vettorizzate (IRQ ARM7);
c. interruzioni non vettorizzate (IRQ ARM7).
L’attivazione e l’assegnazione della categoria a
ciascuna sorgente di interruzione avviene
tramite due registri fondamentali:
VICIntEnable[31:0] e VICIntSelect[31:0].
Le interruzioni di tipo FIQ hanno il proprio bit
a 1 nel registro VICIntSelect. Queste
offrono il minimo tempo di latenza.
Il sistema è pensato per avere una sola
interruzione di questa categoria. Se l’utente
sceglie di assegnare il tipo FIQ a più di una
sorgente deve poi gestire “manualmente”
l’identificazione della periferica chiamante (il
vettore delle ISR di tipo FIQ ha una sola
posizione). Così, il tempo di latenza aumenta.
L’allocazione in memoria nel vettore ARM7 per
le FIQ è all’indirizzo 0x0000001C.
Ciascun bit dei registri è associato, in modo
rigido, a una delle sorgenti di interruzione.
Simone Buso - Microcontrollori e DSP - Lezione 16
33
Simone Buso - Microcontrollori e DSP - Lezione 16
Sistema di interruzioni LP2129
Sistema di interruzioni LP2129
Fino a 16 sorgenti di interruzione fra quelle
attive possono essere classificate IRQ di tipo
vettorizzato.
A ciascuna di queste è riservato un registro
per ospitare l’indirizzo della routine di servizio
da chiamare (VICVectAddr0-15 in ordine di
priorità).
All’arrivo di un interrupt di tipo vettorizzato,
l’indirizzo della ISR è reso disponibile in modo
automatico in un registro (VICVectAddr) adhoc, che deve essere letto da programma per
saltare alla ISR desiderata.
Le sorgenti che non sono di tipo FIQ e a cui
non è assegnato un registro VICVectAddrX,
sono considerate non vettorizzate.
A queste è associato un unico indirizzo per la
routine di servizio (VICDefVectAddr). Il
programma deve quindi provvedere in modo
autonomo al riconoscimento della sorgente di
interruzione.
Queste IRQ hanno la minima priorità.
Le interruzioni non di tipo FIQ hanno una sola
locazione a disposizione nel vettore dell’ARM7,
situata all’indirizzo 0x00000018.
Simone Buso - Microcontrollori e DSP - Lezione 16
35
Simone Buso - Microcontrollori e DSP - Lezione 16
32
34
36
6
Sistemi di sviluppo per LP2129
Il sistema di sviluppo uVision 3
Anche per il mC LP2129 esistono sistemi di
sviluppo completi, prodotti da terze parti. Essi
si basano su quello per il processore ARM, e
includono la simulazione più o meno completa
delle periferiche.
Il sistema di sviluppo che useremo come
esempio, include la simulazione di tutte le
periferiche citate e offre la possibilità di
programmare segnali di ingresso per i pin del
processore.
Questo rende possibile il test di applicazioni
anche di una certa complessità.
Simone Buso - Microcontrollori e DSP - Lezione 16
Questo sistema di sviluppo comprende tutti i
tool fondamentali per la scrittura e il test di
programmi per il mC LP2129 (e per moltissimi
altri, in realtà).
E’ fornito di assemblatore, linker, debugger e
compilatore C. Il sistema permette di usare
tanto i tool della ARM, quanto quelli della
Cygnus (che sono gratuiti e di ottima qualità).
Il sistema include un simulatore del processore
e delle periferiche di ottimo livello.
Infine, permette la scrittura della memoria
del mC in modalità seriale (tool Philips).
37
Il sistema di sviluppo uVision 3
Simone Buso - Microcontrollori e DSP - Lezione 16
Il sistema di sviluppo uVision 3
Layout della
scheda di
valutazione.
Chip LP2129
Si notano le
porte di
comunicazione e i
diversi dispositivi
per il test delle
applicazioni come
LED, tasti,
potenziometro …
Hardware del sistema di sviluppo per mC
LP2129: scheda di valutazione e interfaccia
JTAG verso il PC (venduta separatamente …).
Simone Buso - Microcontrollori e DSP - Lezione 16
38
39
Simone Buso - Microcontrollori e DSP - Lezione 16
40
7