Corso su ARM: Confronto tra Architetture

Nella scorsa puntata abbiamo accennato ed iniziato ad affrontare l'argomento Cortex M0+ ma adesso, forti delle basi della prima puntata, è il momento di andare avanti. Naturalmente non era possibile spiegare l'architettura ARM in così poco tempo e pertanto nella puntata di oggi approfondiremo ancora di più questo argomento, scendendo nel dettaglio, specie mettendo in confronto diretto ARM7 con Cortex, che ci servirà per parlare della FRDM-KL46Z. Siete pronti?

Dopo il buon numero di informazioni che vi abbiamo dato nella prima puntata, questa seconda servirà a rendervi ancora più consapevoli di come sia fatta e di come si sia evoluta l'architettura ARM. Cercheremo, nel corso delle prossime puntate, in particolare delle prossime due, di aggiungere sempre nuovi dettagli in maniera tale da darvi un quadro che sia il più completo possibile. Tutto questo verrà fatto evidenziando differenze e peculiarità dell'architettura Cortex anche con le altre, soprattutto in termini di prestazioni.

La famiglia Cortex, di cui ci occupiamo oggi, è costituita da una serie di blocchi funzionali collegati tra loro in diverse configurazioni, single o multiple core, e sono proprio queste combinazioni a renderla così interessante e variegata soprattutto perché permette e promette davvero di poter essere impiegata in tante applicazioni differenti.
Non solo ma dovete tener presente che questa caratteristica rende taluni processori indicati per svolgere anche compiti piuttosto complessi. Ma andiamo per gradi e vediamo, dapprima, che cos'è cambiato nel tempo all'architettura rispetto ad altre versioni e quali novità sono state introdotte.

Instruction Set Architecture

Prima di farlo però credo sia fondamentale una PRECISAZIONE: per alcuni, magari non troppo smaliziati, alle prime armi e che si avvicinano a questo mondo, le sigle potrebbero essere fuorvianti. Per questo bisogna chiarire subito che l'ARM Cortex è una famiglia di microprocessori basata sul set di istruzioni ARMv7.
Quando si parla di versione dell'architettura e set di istruzioni, quindi, bisogna necessariamente stare particolarmente attenti e non fare confusione!
Un set di istruzioni, o instruction set, più precisamente Instruction Set Architecture (ISA), serve per descrivere l'architettura di un calcolatore al programmatore e ne caratterizza gli aspetti fondamentali tra cui:

  • i tipi di dati nativi (se più d'uno);
  • le istruzioni;
  • i registri;
  • (e naturalmente) le modalità di indirizzamento;
  • l'architettura della memoria;
  • la gestione degli interrupt;
  • l'I/O esterno (se c'è!).

Quindi, stiamo parlando di una specifica, dell'insieme di tutti gli "opcode" ovvero di tutti i codici binari nativi implementati da chi ha progettato la CPU. L'insieme degli opcode di una specifica ISA è anche detto linguaggio macchina della ISA.
Talvolta, l'ISA viene utilizzato anche per effettuare una distinzione dell'insieme delle caratteristiche di cui abbiamo parlato dalla microarchitettura, cioè dalle tecniche di progettazione utilizzate per implementare il set di istruzioni.
L'esempio classico che viene fatto per spiegare meglio questo concetto riguarda il Pentium di Intel e l'AMD Athlon: essi implementano versioni quasi identiche dell'instruction set x86 ma, al loro interno, sono completamente diversi.

Dal momento che ne stiamo parlando, senza finire troppo fuori tema, vale la pena di accennare che trattandosi di un set di istruzioni esso può anche essere emulato da un interprete (naturalmente software). Un emulatore effettuerà una traduzione da una ISA ad una di un altro tipo, necessariamente differente. Questa è una soluzione che, in generale, è più lenta rispetto all'implementazione diretta sull'hardware ed il motivo si capisce con facilità.

Torniamo a noi

L'importanza di quello che abbiamo dovuto precisare sarà certamente più chiara adesso a chi si affaccia per la prima volta questo mondo e, probabilmente, gli utenti più smaliziati avranno anche qualcosa da aggiungere.
Concludendo questa parentesi, torniamo a noi per vedere che cos'è cambiato rispetto al passato. In particolare, dicevamo, con la versione ARM 6.

Rispetto alla versione 6, la famiglia Cortex introduce una serie di importanti novità.
Tra queste, la prima è certamente l'unità NEON. L'unità NEON sviluppata per eseguire operazioni SIMD su vettori di 64 o 128 bit. SIMD, come molti di voi sicuramente sapranno, è un acronimo che sta per Single Instruction, Multiple Data, ed indica un'architettura in cui ci sono più unità contemporaneamente che elaborano dati diversi in parallelo ed è un'architettura che lavora su processori vettoriali, ovvero CPU, che sono progettate allo scopo di svolgere operazioni matematiche su più dati elementari contemporaneamente (da cui l'informazione precedente sulla profondità).

L'unità NEON è dotata di registri dedicati ed i vettori possono contenere numeri interi a 16 o 32 bit oppure numeri in virgola mobile a singola precisione a 32 bit.

L'unità opera in parallelo alla pipeline principale ed essa interviene solamente durante il caricamento delle istruzioni da eseguire.

L'unità in virgola mobile VFPv3 raddoppia i registri della precedente versione portandoli a 32 ed introduce, inoltre, delle nuove operazioni.

Il set di istruzioni Thumb-EE è un derivato del set di istruzioni Thumb-2 (che a sua volta è strettamente collegato con Thumb di cui abbiamo parlato nella scorsa puntata) ed è nato per sostituire le istruzioni Jazelle. Queste vengono impiegate per velocizzare l'esecuzione del codice eseguito su macchine virtuali come quella richiesta da Java.

TrustZone, come il nome suggerisce, è una modalità di esecuzione "sicura" che serve a permettere l'esecuzione di codice sicuro o per eseguire meccanismi di DRM, un acronimo noto ai più da diversi anni, che sta per Digital Rights Management.

L'intera famiglia Cortex è, a sua volta, suddivisa in tre serie distinte: la A (Application), la R (Realtime) e la M (Microcontroller). La prima, la più completa è quella che propone la maggiore potenza di calcolo, è indirizzata ad applicazioni quali computer, telefoni cellulari ma, più in generale, tutte quelle applicazioni e qui campi che richiedano potenza di calcolo e grande flessibilità progettuale. Anche dal punto di vista delle istituzioni, come vedremo meglio fra un attimo, questa risulta essere la serie più completa e che contiene al suo interno tutte le funzionalità.
La R viene sviluppata per applicazioni e sistemi realtime mentre la M, la più ridotta, implementa alcune istruzioni e non presenta MMU.

Vediamo tutto questo nella seguente tabella (fai click per ingrandire):

La serie M e l'M0+

Come abbiamo detto diverse volte, l'ARM Cortex-M è una serie di microcontrollori ed essa è composta da cinque distinti elementi: Cortex-M0, Cortex-M0+, Cortex-M1, Cortex-M3, Cortex-M4. Essi si differenziano per una serie di caratteristiche che adesso vedremo. Possiamo già anticipare, però, che il loro impiego, naturalmente, dovrà essere sempre e comunque commisurato alle loro possibilità e che la scelta dovrà ricadere su quello che si dimostra essere il più indicato per svolgere un determinato compito in una specifica applicazione.
Tra le tante caratteristiche che possono renderli più o meno idonei per ciascuna applicazione ci sono anche le seguenti:

  • interrupt esterni: da 0 a 32;
  • controller Wake-up interrupt: opzionale;
  • registro di offset Vector T: opzionale;
  • ordinamento dei dati (endianness): Little-endian o big-endian;
  • profondità delle istruzioni di fetch: 16 bit o, più frequentemente, 32;
  • supporto User/Privilege: opzionale;
  • Reset di tutti i registri: opzionale;
  • Single-cycle I/O port: opzionale;
  • Debug Access Port (DAP): opzionale;
  • supporto per debug halting: opzionale;
  • numero di comparatori watchpoint: da 0 a 2;
  • numero di comparatori breakpoint: da 0 a 4.

Dei cinque componenti, l'M0, l'M0+ e l'M1 implementano l'architettura ARMv6-M mentre gli altri due versioni differenti della 7; in particolare abbiamo ARMv7-M per l'M3 ed ARMv7E-M per l'M4.
Vediamo, adesso, qualche ulteriore dettaglio con la seguente tabella (fai click per ingradire):

Qui vanno precisate alcune cose proprio rispetto alla terna M0, M0+, M1: i tre non includono assolutamente il set di istruzioni Thumb per intero ed infatti mancano CBZ, CBNZ, IT ed anche il divide. Del Thumb-2  sono comprese: BL, DMB, DSB, ISB, MRS, MSR.
Tutto questo trova spiegazione non soltanto del tipo di applicazioni cui sono prevalentemente destinati ma anche rispetto al tentativo di tenerli il più piccoli ed economici possibile.
Il Cortex-M3 aggiunge tre istruzioni del set Thumb e l'intero Thumb-2, tra le altre cose.
Il Cortex-M4 aggiunge le istruzioni per il DSP ed anche un'unità floating-point.

Ma adesso, finalmente, è il momento di andare ad analizzare più nello specifico il vero protagonista della puntata di oggi (e del corso).

Tutto quello che abbiamo detto fino ad adesso serviva a farvi capire questo: quando parliamo di Cortex-M0+ ci stiamo riferendo ad una versione specializzata dell'M0.
Ha pipeline ridotte da tre a due, con l'esplicito scopo di diminuire il consumo di potenza totale.
Oltre alle features di debug che già esistono nell'M0, all'M0+ è possibile aggiungere, in sede di fabbricazione, il cosiddetto MTB, ancora una volta un acronimo, questa volta di Micro Trace Buffer; si tratta della giunta di una semplice instruction trace.
All'M0+ sono state aggiunte alcune funzionalità di M3 ed M4 quali memory protection unit (MPU) e la vector table relocation.

Ed ora vediamo di raccogliere un po' le idee, mettere insieme tutto quello che abbiamo visto e dare una breve caratterizzazione dell'M0+ in termini di caratteristiche:

  • architettura ARMv6-M;
  • set di istruzioni: Thumb (tutto a parte CBZ, CBNZ, IT), Thumb-2 (subset, soltanto BL, DMB, DSB, ISB, MRS, MSR), 32-bit hardware multiply, da 1 a 32 cicli (silicon option);
  • 2-stage pipeline;
  • consumo di potenza dinamica: 11.21 µW/MHz;
  • features opzionali: MPU 8 region, Vector table relocation, porta di I/O Single-cycle, Micro Trace Buffer (MTB).

Sulla implementazione, e sulla commercializzazione, ecco alcuni dati. Esistono 3 soluzioni tecnologiche realizzative differenti: 180ULL, 90LP e 40G. Si tratta di 3 distinti Power Management Kit, soluzioni studiate per ridurre al meglio la dissipazione di potenza dinamica di un chip.
180ULL lavora tipicamente con tensione di alimentazione pari a 1.8 V, ha un consumo di potenza dinamico pari a 52 µW/MHz ed occupa un'area pari a 0.13 mm2.
90LP è polarizzato ad 1.2 V, consuma quasi un quinto, cioè 9.8µW/MHz ed occupa 0.035 mm2.
Infine 40G ha una tensione di funzionamento inferiore al Volt (0.9 per la precisione), consuma un terzo del precedente (3 µW/MHz) ed occupa solo 0.009 mm2.

Siamo ai saluti

Bene, con questi ultimi dati tecnici, la puntata di oggi può dirsi conclusa. Abbiamo analizzato diversi aspetti dell'architettura in generale, della famiglia Cortex, della serie M ed in particolare della serie M0+ che per versatilità e costo sembra essere il sostituto naturale (e meglio performante) dei micro ad 8bit. Questa la famiglia completa degli ARM Cortex M0+. Come sempre, nell'attesa della prossima puntata, in cui ci occuperemo di istruzioni e programmazione, i commenti restano a  disposizione di tutti voi proprio per fugare ogni genere di dubbio che possa esservi venuto leggendo questo articolo. Quindi se avete domande, dubbi o perplessità potete tranquillamente scriverli qui. Alla prossima.

 

                    

Per ulteriori informazioni potete scrivere a questa email: [email protected]

Scarica subito una copia gratis
Tags:

2 Commenti

  1. Avatar photo Giorgio B. 2 Ottobre 2013
  2. Avatar photo Tiziano.Pigliacelli 3 Ottobre 2013

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend