Oggi, qui, sulle nostre amate pagine, si inaugura una nuova avventura. Dopo il corso di microprogrammazione terminato poco tempo fa e l'annuncio del seminario Freescale di qualche giorno addietro, annunciamo che questa sarà la prima di una serie di puntate in cui ci occuperemo di lavorare su di un microcontrollore a 32 bit. Quale? Quali sono le sue caratteristiche? Quali i suoi punti di forza? Che cosa ci faremo? Se tutte o anche soltanto alcune di queste domande vi sono già venute in mente, beh… l'unica cosa che dovete fare è continuare a leggere.
Sta per iniziare una nuova avventura qui sulle nostre pagine e questa avrà come protagonista una scheda Freescale, l'architettura ARM, Freescale, il suo Cortex-M0+ e tutti noi. Gli ingredienti ci sono, gli strumenti anche… Possiamo cominciare.
Come abbiamo già detto in apertura, questa prima puntata servirà da introduzione per fare in modo che tutti noi abbiamo più chiaro di che cosa parleremo. L'argomento fondamentale di oggi è l'architettura per cui cercheremo di parlare in linea generale di che cos'è ARM, da dove nasce e vedremo, più avanti, nel dettaglio, la sua struttura base, le sue caratteristiche funzionali e cercheremo di prenderci confidenza subito per poter far diventare questo corso straordinariamente pratico.
Un po' di storia
Avete mai sentito qualcuno dire che non possiamo capire chi siamo se non sappiamo qual è il nostro passato? Beh, ha ragione! E pertanto, vediamo di capire qual è il passato di ARM, da dove viene e come ha fatto ad arrivare dov'è oggi.
ARM Holdings (London Stock Exchange: ARM, NASDAQ: ARMH) è una società di alta tecnologia con sede a Cambridge, nel Regno Unito. Questa società è molto conosciuta in tutto il mondo prevalentemente per la sua linea di processori basata sull'architettura ARM. Non si tratta dell'unica attività dell'azienda, che si occupa anche di lavorare su system-on-a-chip, piattaforme hardware, infrastrutture e software sotto marchi quali RealView e KEIL. Venne fondata come joint venture tra Acorn Computers, la Apple Computer e VLSI Technology per sviluppare una linea di microprocessori RISC che, nel seguito, sono stati utilizzati da molti produttori per Application-Specific Integrated Circuit (ASIC).
La società è stata fondata nel '90 come Advanced RISC Machines Ltd ed ha vissuto una costante espansione dal '93 per diversi anni a venire. Nel '94 è arrivata nella Silicon Valley e a Tokyo mentre nel '98 si è espansa ottenendo la possibilità di entrare nel mercato degli hard disk. Cambia nome in ARM Ltd. e diventa una società quotata in borsa. Seguirono diverse acquisizioni, tra cui quella della Infinite Designs. Attualmente le sedi si trovano in diversi stati degli Stati Uniti d'America ma anche in Cina, Giappone, Norvegia, Francia e Germania.
Una storia che sfida la crisi ed i mercati globali, fatta di nuove idee e di possibilità sempre diverse su un mercato in rapida evoluzione.
Entriamo nel merito
Una caratteristica distintiva dei processori ARM, certamente una delle più importanti almeno nelle applicazioni di tipo consumer, è il basso consumo di potenza; questo li rende dispositivi molto diffusi nel mercato delle applicazioni portatili. Sappiamo bene, infatti, che la maggior parte dei dispositivi cellulari, smartphone, palmari ma anche tablet attualmente in commercio utilizzano un core ARM. Tra questi ci sono sicuramente dispositivi marchiati Nokia, Sony e Samsung ma anche Apple. E fuori dalle applicazioni "mobile", ci sono consolle Nintendo, diversi ricevitori GPS, macchine fotografiche digitali e così via dicendo.
Un aspetto importante dell'operato di ARM è rappresentato dal fatto che non produce direttamente i propri processori, a differenza di quanto fanno molti altri produttori sul mercato; la sua politica riguarda la vendita di licenze sulla tecnologia. Così tutte le società che acquistano le licenze ARM possono creare il loro processore sapendo che il prodotto finito sicuramente funzionerà ma lasciando l'azienda che ha sfornato la licenza libera dalle logiche di mercato che la costringerebbero ad entrare in diretta concorrenza con le sue clienti.
Nel 2007, stando ai dati disponibili, sembrerebbe che siano stati prodotti più di 2,9 miliardi di integrati basati su core ARM e bisogna tener conto che non era ancora avvenuto il boom di smartphone, tablet e di tutti gli altri dispositivi mobile.
Che cos'è l'ARM? Introduzione all'architettura
Come vi avevamo accennato, questa puntata sarà introduttiva ed avrà lo scopo di analizzare l'architettura, introducendo la sua struttura di base, valutandone le caratteristiche strutturali e permettendo a tutti di conoscere al meglio l'ARM. Tratteremo, quindi, l'architettura in generale e le porzioni, della stessa, che si trovano nell'M0+ di Freescale. Iniziamo subito inquadrando il problema definendo l'architettura ARM.
Che cos'è, come funziona e quali sono le sue caratteristiche principali?
Quando diciamo "architettura ARM" ci stiamo, in realtà, riferendo ad una famiglia di processori basati su un set ridotto di istruzioni (RISC) inizialmente progettate negli anni 80 e che si sono evolute fino ad oggi diventando processori a 32 bit.
Come molti già sapranno, grazie al set RISC, tutti i processori, e naturalmente anche i processori ARM, sono in grado di eseguire compiti anche piuttosto complessi impiegando un numero di istruzioni, e quindi di passi di funzionamento, significativamente inferiori rispetto ad altri, generalmente impiegati in architetture tradizionali.
Il primo esemplare è datato 1985 (ARM1) mentre ARM2 è nato l'anno successivo. Il secondo era un processore con bus dati a 32 bit, bus di indirizzi a 26 bit (in grado di indirizzare fino a 64 MB) e registri a 16/32 bit. Uno di questi aveva lo scopo di definire l'allineamento del program counter, dal momento che i primi 6 bit e gli ultimi 2 erano utilizzati come flag per specificare lo stato del processore. ARM2 era una struttura incredibilmente semplice per essere una CPU a 32 bit poichè, rispetto ai concorrenti, meno della metà dei componenti (ad esempio del Motorola 68000), conteneva cioè "solo" 30k transistor.
ARM3 venne dotato di 4KB di cache per migliorare le prestazioni.
Successivamente, Apple iniziò a lavorare alla nuova versione e da quel progetto, nel '91, nacque ARM6 ed Apple utilizzo ARM 610, processore basato su ARM6 per il modello Newton. Il core del progetto era quasi immutato rispetto alla versione 2, dal momento che non era aumentata di molto l'integrazione dei transistor (poche migliaia di più). La scelta dipendeva dal fatto che si era pensato di dotare il processore di componenti esterne opzionali al fine di mantenere la soluzione finale a più basso costo e consumo.
L'ottimizzazione per singoli compiti funzionò!
L'implementazione di maggior successo è stata di certo ARM7TDMI, utilizzato su larga scala in console portatili, cellulari e altre periferiche.
E arriviamo ai giorni nostri per raccontarvi cosa c'è (di solito) oggi dentro i nostri devices. L'architettura più comunemente supportata da Windows Mobile ed Android è ARM4. I processori XScale e ARM926 sono basati su ARMv5TE mentre gli StrongARM, gli ARM925T e gli ARM7TDMI sono basati su ARM4.
L'architettura ARM, dicevamo, è un'architettura RISC che include:
- Architettura load/store;
- Set di istruzioni ortogonale;
- Numerosi registri a 16/32 bit;
- Istruzioni a lunghezza fissa per semplificare la decodifica e l'esecuzione a costo di diminuire la densità del codice;
- Completamento di un'istruzione per ogni ciclo di clock (situazione ideale priva di stalli );
Per rendere il tutto più interessante, versatile e funzionale, furono inserite altre features:
- Esecuzione condizionata di molte istruzioni per ridurre salti e compensare stalli della pipeline;
- Solo le operazioni aritmetiche possono alterare i registri delle esecuzioni condizionate;
- Shifter a 32 bit impiegabile insieme con la maggior parte delle istruzioni senza penalizzazioni temporali;
- Indirizzamento a indice;
- Interrupt a 2 livelli veloce e semplice con sottosistema di registri collegati che commutano.
Il tutto accompagnato da un altro aspetto molto interessante che sono ulteriori 4 bit utilizzati per realizzare codici condizionali per ogni istruzione. Questi hanno ridotto le possibilità di indirizzo, visto che il processore non ha molti bit da specificare, ma il grande vantaggio è che questi codici permettono di evitare i salti nel caso di semplici operazioni condizionali. Ne resta un esempio il problema del massimo comun divisore mediante l'algoritmo di Euclide.
int gcd (int i, int j) { while (i != j){ if (i > j) i -= j; /*in forma classica i=i-j;*/ else j -= i; /*in forma classica j=j-i;*/ } return i; }
In assembly ARM si ha:
loop CMP Ri, Rj ; set condition "NE" if (i != j) ; "GT" if (i > j), ; or "LT" if (i < j) SUBGT Ri, Ri, Rj ; if "GT", i = i-j; SUBLT Rj, Rj, Ri ; if "LT", j = j-i; BNE loop ; if "NE", then loop
Queste caratteristiche, tra le altre, rendono i programmi ARM tipicamente più densi degli equivalenti per altri processori ed il processore effettua meno accessi alla memoria, riuscendo anche a riempire meglio le pipeline. Tutto questo vuol dire che le CPU ARM possono utilizzare frequenze inferiori a quelle dei concorrenti consumando effettivamente meno potenza per svolgere gli stessi compiti. Un gran bel risparmio, non trovate?
Una caratteristica interessante di questi processori è che, col tempo, il set di istruzioni incrementa: i primi processori ARM (quelli antecedenti all'ARM7TDMI) non avevano, ad esempio, istruzioni per caricare quantità di profondità 2 byte, pertanto non era possibile gestire variabili di tipo short in C.
I primi processori tipo ARM7 erano basati su un disegno con pipeline a 3 stadi (quelli che tutti noi ben conosciamo): fetch, decode ed execute. I processori più moderni, come l'ARM9, per incrementare le prestazioni sono passati a pipeline a 5 stadi.
Le features
Thumb
Gli ultimi processori ARM sono dotati di un set di istruzioni a 16 bit chiamato Thumb. Esso impiega 4 bit per ciascuna istruzione. Il codice Thumb è più leggero e, naturalmente, è dotato di meno funzionalità. Ad esempio, solo i salti possono essere condizionati e alcuni opcode non possono essere utilizzati da tutte le istruzioni. Thumb resta fondamentale in sistemi con larghezza di banda limitata. Molti sistemi embedded sono dotati di un bus di collegamento alla memoria limitato e, anche se il processore è capace di indirizzare a 32 bit, spesso si utilizzano indirizzamenti a soli 16 bit o simili. Qui, Thumb ottimizza le parti di codice che richiedono molta potenza di calcolo. Il primo impiego risale all'ARM7TDMI; successivamente è stato utilizzato su tutti gli ARM9 e successivi.
Jazelle
ARM ha implementato la tecnologia per eseguire nativamente il Java bytecode, insieme con codice ARM standard e Thumb. Il supporto alla tecnologia è indicato da una "J" nella sigla, come nel caso dell'ARM926J-S. Trova impiego in tutti i dispositivi, specie mobile, per l'esecuzione di Java ME ed altre applicazioni.
NEON e VFP
La tecnologia NEON non è altro che una combinazione di istruzioni SIMD (un acronimo che sta per Single Instruction Multiple Data) a 64 e 128 bit. Lo scopo è quello di accelerare il trattamento e l'elaborazione di segnali multimediali. Questo ha notevoli applicazioni per esempio nella decodifica degli MP3. VFP è invece un'estensione dell'architettura che serve per le operazioni matematiche. Sostanzialmente si occupa di trattare dati in virgola mobile sia nel caso di singola sia nel caso di doppia precisione. L'attenzione è rivolta allo standard ANSI/IEEE Std 754-1985 Standard for Binary Floating-Point Arithmetic.
Ed ora, vediamo di farci un'idea più chiara di che cosa parleremo in questo corso.
Siamo sicuri che questa seppur ampia panoramica iniziale abbia soltanto scalfito la superficie di tutto quello che c'è da raccontare per poter fare una descrizione esaustiva e completa ma l'intero universo dell'architettura ARM è davvero difficile da descrivere in poche parole. Ecco per quale motivo il nostro corso si focalizzerà sull'ARM CORTEX-M0+ di Freescale, attualmente uno dei più interessanti soprattutto per il "power-critical design".
Il corso sarà strutturato in tre fasi diverse, all'interno delle quali questa prima puntata si colloca come l'introduzione al problema. Tra un paio di articoli saremmo già pronti ad entrare nello specifico dell'M0+ ma prima sarà indispensabile dedicare due puntate sia al confronto diretto tra l'architettura ARM 7 e ARM Cortex sia focalizzarci sulla programmazione ed il set di istruzioni. Molti dei nostri utenti, molti di noi, hanno già fatto diverse esperienze con microcontrollori ad 8 bit. Bene passare a programmare a 32 può presentare dei problemi e vale la pena di spendere del tempo per cercare di capire questo. Cosa cambia? Come? Qual è l'approccio? A queste e ad altre domande cercheremo di rispondere insieme.
Finita questa fase, inizia la seconda in cui cercheremo di andare dentro l'architettura dell'hardware analizzando anche una soluzione completa che sarà a nostra disposizione sino alla fine del corso. Stiamo parlando della FRDM-KL46Z, una piattaforma di sviluppo per Kinetis KL3x e KL4x.
Finita la fase di analisi della scheda completeremo la seconda parte del corso parlando degli ambienti di sviluppo che supportano il progettista nella programmazione sia dal punto di vista tecnico sia dal punto di vista grafico. Diverse saranno le soluzioni che realizzeremo e tutte, scopriremo, giocano un ruolo fondamentale. Stiamo parlando di CodeWarrior Development Studio ma anche di MQX Lite e Processor Expert, nomi che ai più esperti sicuramente risulteranno già familiari
La conclusione di questa fase ci avvierà verso l'ultima numerosa serie di articoli in cui analizzeremo schede tecniche, application note ed inizieremo seriamente a sperimentare per mettere a dura prova la scheda.
Come sempre, lo ricordiamo, questo blog è soprattutto di chi legge per cui se avete richieste specifiche su questo argomento potete tranquillamente farle nei commenti. Se conoscete la scheda e volete cimentarvi anche voi nella realizzazione di qualche applicazione, la terza parte del corso potrà vedere anche i vostri contributi pubblicati su queste pagine.
Ultima nota per salutarvi in bellezza: tenete bene a mente ciò che leggerete in questi articoli perchè la scheda sarà in palio per il nostro Review4U 2.0! Alla fine del contest, dunque, potrete essere in grado di sperimentare quello che avrete visto e letto, se riuscirete ad aggiudicarvela.
Alla prossima.
Davvero un articolo interessante, ma non avendo mai utilizzato microcontrollori ho varie lacune da dover colmare prima di poter seguire questo corso. Domanda: che frequenza ha il corso? In breve: quanto tempo ho per colmare il buco di conoscenze che ho per poter agganciarmi a tutte le informazioni che questo corso si prefigge? Mi puoi anche consigliare degli articoli utili a questo scopo? Inoltre, dato che ora tutti i vendor di FPGA hanno scelto di inserire nei loro SoC un processore di tipo ARM volevo chiederti quanto questo corso passa essermi di aiuto per quei tipi di processori o se il fatto di aver scelto un processore specifico mi allontana troppo da quelli scelti dai vendor FPGA. Grazie e complimenti per l’ennesimo interessantissimo articolo
Ma quindi questo sarebbe il corso che prosegue quello di microprgrammazione?
Sembra molto interessante…
Come mai non esce in EOS-Book?
Ci farete comunque il monotematico sopra?
Mi accodo anche io a queste domande 😀
Allora, vediamo se riesco a rispondere con un solo commento a tutti e due.
Per Tiziano: il corso avrà frequenza settimanale, questa volta. Non si tratta di un corso mensile. Finiremo entro fine anno.
Salvo stravolgimenti (che ormai è una cosa che mi sentite dire sempre ma perché non si può mai sapere nella vita…), sicuramente il giorno fisso sarà il mercoledì.
Io non so dirti quanto tempo ti occorre per “colmare il buco” perché non so di che tipo di “buco” stiamo parlando… 🙂
Se vuoi che io ti consigli qualcosa da leggere, sicuramente vai direttamente verso tutti i link che metteremo all’interno degli articoli!
Fortunatamente, per la natura del corso che abbiamo in mente, non c’è bisogno che tu stia “al passo”.
Noi siamo sempre qui…! 😀
Però capisco che tu ci tenga per cui quello che posso consigliarti è di andare subito a vedere la documentazione della scheda e, per qualunque dubbio che riguarda il processore e la sua architettura, fai riferimento alla documentazione ARM.
Se poi su questi documenti dovesse avere dubbi, domande, perplessità o questioni, sicuramente i commenti saranno il luogo in cui ne discuteremo al meglio.
Tieni presente, però, che faremo certamente di tutto per rendere il corso chiaro! 😉
Per Giorgio: sì, è lui!
Abbiamo scelto di proseguire così perché l’impronta pratica e la disponibilità della scheda ci hanno letteralmente illuminato la strada 🙂
Sebbene ci siano ancora altre idee per andare avanti!!!
Ma ve le proporremo poi 😉
Per quanto riguarda il monotematico, onestamente non so risponderti ancora. Credo sia troppo presto.
In generale ti direi di sì ma credo anche che avrebbe poco senso dal momento che viene pubblicato in un giorno in cui non ci sono vincoli per l’accesso…
Non trovi? 😀
In effetti… 🙂
Ciao Tiziano,
se sei a digiuno dell’argomento microcontrollori, io ti consiglio di vedere prima una serie di concetti introduttivi applicati ad architetture semplici, esempio classico i PIC ad 8 bit.
In rete si trovano numerosi tutorial sull’argomento. Non li ho mai cercati nel sito, ma immagino che sullo stesso Elettronica Open Source siano presenti, altrimenti se vuoi possiamo sentirci in pvt e posso darti dei riferimenti (non li pubblico nel commento per evitare pubblicità… 😉 ).
Sempre IMHO, avere prima un quadro generale di cosa sia, come funzioni e cosa permetta di fare un microcontrollore sia una base molto utile, se non indispensabile.
Nel frattempo puoi sempre seguirti di volta in volta il corso di Piero sugli ARM, “bestioline” a 32 bit molto più complesse dei PIC ad 8 (conta che alcuni di essi sono impiegati anche in ambito militare per il controllo di attrezzature speciali, tra le quali, purtroppo, anche armi…). Magari alcuni concetti potrebbero risultare un pò ostici, ma alla fine se ne viene a capo.
Il “tempo per colmare la lacuna” dipende poi dai vari fattori tipo il livello di dettaglio fino a cui vuoi addentrarti e, soprattutto, se l’argomento ti piace o meno…. 😉
Diciamo che, in teoria, se dedichi una mezz’ora al giorno su un tutorial più o meno completo, con una settimana dovresti arrivare a coprire i primi argomenti fondamentali, quali ad esempio l’I/O, le interruzioni e le operazioni temporizzate
Grazie tante delfino_curioso, seguirò il tuo consiglio. Inizierò con dei tutorial per PIC a 8 bit, magari mi aiuterà.
Il livello di dettaglio per ora non è molto elevato, però vorrei essere in grado, qualora si presentasse la necessità, di addentrarmi in un ARM senza avere l’impressione di essere in terra straniera.
Thanks
Di corsi sui PICmicro ne abbiamo pubblicati addirittura 3:
Picmicro CULT del mio amico Sergio
http://it.emcelettronica.com/picmicro-picmicro-cult
Picmicro ADVANCED del nostro collaboratore Paolo Conte e supervisionato da me
http://it.emcelettronica.com/picmicro-picmicro-advanced
Picmicro BASIC
http://it.emcelettronica.com/picmicro
Segui anche la relativa TAG
http://it.emcelettronica.com/elettronica/etichette/picmicro
Grazie mille per la dritta, approfitteró di certo 🙂
Ciao, questo corso è “compatibile” con Arm cortex-m3 stm32f103c8t6?
Grazie,
Ivan