Lezione 16 Sommario • 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 1 Lezione 16 Materiale di riferimento 1. Datasheet del microcontrollore Philips LPC2129, disponibile sul sito web del corso in formato pdf. 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. Simone Buso - Microcontrollori e DSP - Lezione 16 2 1 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. Si tratta quindi di un vero e proprio standard industriale. Simone Buso - Microcontrollori e DSP - Lezione 16 3 Il processore ARM7 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. Simone Buso - Microcontrollori e DSP - Lezione 16 4 2 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”). 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 5 Il processore ARM7 Thumb PC PC+4 PC+8 PC PC+2 PC+4 Fetch Decode 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 3 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 7 Il processore ARM7 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”. Simone Buso - Microcontrollori e DSP - Lezione 16 8 4 Il 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). Il passaggio da un modo di funzionamento ad un altro corrisponde ad eventi particolari come il verificarsi di interruzioni o eccezioni. Simone Buso - Microcontrollori e DSP - Lezione 16 9 Assembly del 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). Simone Buso - Microcontrollori e DSP - Lezione 16 10 5 Assembly del processore ARM7 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: LSL r3 di 2 bit e, dopo, [r1] = [r2] + [r3]. Simone Buso - Microcontrollori e DSP - Lezione 16 11 Assembly del processore ARM7 Altri esempi con ADD: 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[r4] ADD r1, r2, #125 [r1] ← [r2]+125 ADD r1, r2, #0xFF00 [r1] ← [r2]+255·28 L’ultimo esempio è piuttosto “criptico”: la sua spiegazione sta nel modo particolare in cui l’ARM7 gestisce gli operandi costanti (segue). Simone Buso - Microcontrollori e DSP - Lezione 16 12 6 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, …). 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 13 Assembly del processore ARM7 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. 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…. Simone Buso - Microcontrollori e DSP - Lezione 16 14 7 Assembly del processore ARM7 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 15 Assembly del processore ARM7 31 28 cond 25 16 15 20 # Op-code S Rn 12 0 Rd Operando_2 n 0 Aggiornamento CPSR 11 shift 6 Rm 3 0 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. Simone Buso - Microcontrollori e DSP - Lezione 16 16 8 Assembly del processore ARM7 31 28 cond 25 16 15 20 # Op-code S Rn 12 0 Rd Operando_2 shift 1 Aggiornamento CPSR 11 costante 8 0 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·2 2n N.B. 2n! Adesso si può verificare l’esempio precedente! Simone Buso - Microcontrollori e DSP - Lezione 16 17 Assembly del processore ARM7 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. Simone Buso - Microcontrollori e DSP - Lezione 16 18 9 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. Simone Buso - Microcontrollori e DSP - Lezione 16 19 Assembly del processore ARM7 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 20 10 Assembly del processore 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. Simone Buso - Microcontrollori e DSP - Lezione 16 21 Sistema di sviluppo ARM7 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). 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. Simone Buso - Microcontrollori e DSP - Lezione 16 22 11 Esempio di codice ARM7 AREA TestProg, CODE, READONLY ENTRY Inizio 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 DCD DCD DCD DCD DCD 0x00000001 0x00000002 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 ;ciascun vettore occupa 16 byte = 4 locazioni a 32 bit ; ; ; ;qui inizia il vettore B ; ; ; END Simone Buso - Microcontrollori e DSP - Lezione 16 23 Esempio di codice ARM7 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. Simone Buso - Microcontrollori e DSP - Lezione 16 24 12 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. 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 Il microcontrollore LP2129 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. Simone Buso - Microcontrollori e DSP - Lezione 16 26 13 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 27 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. Simone Buso - Microcontrollori e DSP - Lezione 16 28 14 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. Simone Buso - Microcontrollori e DSP - Lezione 16 29 Sistema di interruzioni LP2129 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). 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. Simone Buso - Microcontrollori e DSP - Lezione 16 30 15 Sistema di interruzioni LP2129 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. Anche questa operazione può risultare non banale, specialmente quando non sia fornita adeguata documentazione. Simone Buso - Microcontrollori e DSP - Lezione 16 31 Sistema di interruzioni LP2129 L’organizzazione del sistema di interruzioni VIC dell’LP2129 si presenta discretamente complicata. I registri di configurazione del servizio sono oltre 40! Simone Buso - Microcontrollori e DSP - Lezione 16 32 16 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]. Ciascun bit dei registri è associato, in modo rigido, a una delle sorgenti di interruzione. Simone Buso - Microcontrollori e DSP - Lezione 16 33 Sistema di interruzioni LP2129 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. Simone Buso - Microcontrollori e DSP - Lezione 16 34 17 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. Simone Buso - Microcontrollori e DSP - Lezione 16 35 Sistema di interruzioni LP2129 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 36 18 Sistemi di sviluppo per LP2129 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 37 Il sistema di sviluppo uVision 3 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). Simone Buso - Microcontrollori e DSP - Lezione 16 38 19 Il sistema di sviluppo uVision 3 Chip LP2129 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 39 Il sistema di sviluppo uVision 3 Layout della scheda di valutazione. Si notano le porte di comunicazione e i diversi dispositivi per il test delle applicazioni come LED, tasti, potenziometro … Simone Buso - Microcontrollori e DSP - Lezione 16 40 20