ARCHITETTURA E PROGRAMMAZIONE DI SISTEMI ELETTRONICI INDUSTRIALI
PRIMO BLOCCO SLIDE (02-ArchiARM1)
RIPASSO CONCETTI FONDAMENTALI ARCHITETTURE
I principali componenti dell’architettura sono:
- Processore: contenente le memorie temporanee (ad esempio il register file: memoria con
numero limitato di locazioni, dette registri. Essa esegue operazioni aritmetico-logiche)
- Memoria principale e secondaria: dove vengono memorizzati dati e codice in modo
temporaneo o permanente
- Moduli di input e output che provvedono ad interfacciare utente e processore
- Bus: trasportano informazioni (dati e indirizzi) e segnali di controllo
C’è una particolare gerarchia delle memorie, composta da più livelli. Al livello più alto ci sono i
registri (memoria interna del processore), seguiti da memorie interne (dette memorie on-chip) ed
infine da memorie esterne (dette memorie off-chip). Nel caso del ARM ci sono solamente memorie
on-chip non cache (assenza di memorie off-chip) e sono di 2 tipi:
- SRAM (S = static): memoria volatile alla quale si può accedere in lettura e scrittura alla stessa
velocità. Si tratta di una memoria di un centinaio di KB.
- FLASH: memoria non volatile (senza alimentazione continua a immagazzinare dati) sulla
quale si scrive molto lentamente (occorrono centinaia o migliaia di cicli di clock) al contrario
della lettura, la quale è invece veloce. A causa di tali caratteristiche viene utilizzata per
memorizzare dati quasi costanti. Si tratta di una memoria di un centinaio di MB.
La minima capacità di queste memorie consente loro di essere molto economiche e poco
dispendiose da un punto di vista del consumo energetico.
Lo spazio di indirizzamento dell’I/O può essere di due principali tipologie: memory mapped (I/O
mappato nello stesso spazio di indirizzi della memoria, ci saranno dunque alcuni indirizzi dedicati ad
esso e altri alle periferiche di memoria) o non memory mapped (due spazi di indirizzi separati per
I/O e memoria). Nel caso del ARM l’I/O è memory mapped e lo spazio di indirizzamento di 4GB si
dividerà in due parti riservate ad I/O e memoria (informazioni presenti sulla address map del
manuale del processore).
Ci sono due tipi di informazioni che possono essere trovate in un codice di programma: istruzioni
per l’esecuzione e dati. Tali informazioni possono essere accedute in modo differente:
- Architettura Von Neumann: unico bus per istruzioni e dati
- Architettura Harvard: due bus indipendenti, uno per le istruzioni e uno per i dati. È
l’architettura del ARM.
BOOT: il processore, una volta acceso, comincia a fetchare istruzioni a partire da un indirizzo fisso e
carica tale istruzione nella parte bassa o alta della memoria. Tale zona è il reset vector, in cui è
presente il boot sector. Una volta che il processore ha eseguito questa serie di istruzioni di boot,
attraverso un jump salta alla prima istruzione che gli abbiamo impartito. la zona non volatile del
boot non va modificata. 1
L’ARM è un processore a 32 bit, con bus a 32 bit, memorie e registri a 32 bit (i registri sono 16 da 32
bit chiamati R0, R1, …, R15 ognuno identificato univocamente con un codice a 4 bit). Quando il
processore emette un indirizzo corrispondente a 1 byte, esso in realtà sia in load che in store legge
4 byte (a meno di istruzioni particolari che consentono di leggere o scrivere 1 solo byte). Se il byte
più significativo è quello ad indirizzo più basso si parla di big endian se è quello ad indirizzo più alto
si parla di little endian. L’ARM permette entrambi gli approcci, ma ovviamente una volta che se ne
adotta uno va mantenuto.
Figura 1 - Diagramma del processore
Nell’immagine è rappresentato il diagramma del processore che prendiamo in esame:
- REGISTER BANK: memoria del processore contenente i registri (ovvero gli operandi della
ALU)
- Operandi A e B di input vengono letti, viene fatta su di essi un’operazione dalla ALU e
successivamente il risultato viene rimandato attraverso il WRITEBACK (operando di output)
nel register bank
- Il DATAPATH del processore serve per fare i conti e comprende MUL/DIV, BARREL SHIFTER e
ALU
- WRITE DATA REGISTER & READ DATA REGISTER: formano la Load & Store unit che serve a
registrare i dati dal register file alla memoria o di leggere dalla memoria i dati e trasferirli al
register file per le operazioni ALU. I bus D_HWDATA e D_HRDATA sono quelli di lettura e
scrittura dei dati in memoria e sono entrambi a 32 bit
- I_HRDATA bus istruzioni a 32 bit, l’istruzione entra poi nell’INSTRUCTION DECODE dove viene
decodificata
- I_HADDR bus indirizzi istruzioni a 32 bit
- Cammino di fetch dell’istruzione serve per generare l’indirizzo dell’istruzione
2
- ADDRESS INCREMENTER: incrementa l’indirizzo dell’istruzione di 4 per passare a quella
successiva (a meno di jump, portato dal multiplexer a monte dell’address register)
I registri sono l’area su cui si memorizzano le informazioni su cui il processore sta lavorando. General
pourpose register: possono essere usati da tutti (=/= special pourpose register)
Le istruzioni occupano 32 bit divisi in vari blocchetti, ognuno dei quali contiene dei bit con particolari
significati. La prima parte dei bit di una istruzione sono dedicati alle info sul tipo di istruzione
(opcode, diviso in vari sottocampi), poi il resto è dedicato agli operandi, ovvero i registri (ogni
operando identificato da 4 bit). Non tutte le istruzioni usano tutti i 32 bit, alcuni possono essere
inutilizzati per una particolare istruzione.
Nel CISC ci sono istruzioni di diverse lunghezze e con un numero diverso di operandi (molto più
difficili da codificare). Se usato bene consente di scrivere istruzioni molto piccole anche, usando un
opcode molto corto (istruzioni solitamente usate di frequente).
Le istruzioni sono di 3 classi (in realtà 4 di cui una speciale):
• Data transfer (load/store): trasferimento da e verso la memoria
• Data manipulation: operazioni aritmetiche
• Program control: branch, jump…
ESECUZIONE DELL’ISTRUZIONE: avviene in varie fasi
• Instuction fetch (preleva istruzione dalla memoria)
• Instruction decode (decodifica dell’istruzione)
• Instruction execute (esegue l’istruzione)
Per svolgere queste fasi il processore ci mette del tempo, esse sono successive da un punto di vista
logico. Implementando ciò in un’unica logica intesa come una sequenza di gate notiamo che il tempo
che ci vuole in totale per eseguire un’istruzione è la somma delle 3. Il clock deve essere maggiore o
uguale a quello che occorre per superare queste fasi (→il clock del processore deve essere >= a
quello necessario per svolgere una singola istruzione). Se però si pensa che la perfomance del
processore non sia adeguata (troppo lento il clock) nasce il concetto di pipelining.
La pipeline permette l’esecuzione concorrente di molte istruzioni. Ad ogni colpo di clock avviene
sempre qualcosa nelle unità di fetch, decode e execute. La frequenza con cui escono le istruzioni è
molto più alta. Per una singola istruzione servono 3 colpi di clock, ma possiamo già iniziare a fetchare
la prossima istruzione appena dopo il primo colpo di clock. Il colpo di clock equivale allo stadio più
lento. La tecnica di pipelining è quella usata dal Cortex ARM.
Ci possono essere dei problemi nella pipeline: stalli. Supponiamo che l’istruzione eseguita per prima
sia un jump, il fetch fa il suo dovere, il decoder pure ma l’esecutore deve calcolare l’indirizzo a cui
saltare quindi l’istruzione successiva da eseguire si saprà solo alla fine del terzo colpo di clock.
L’istruzione che verrebbe fetchata sarebbe quella successiva, nonostante ci sia un jump (perché
ovviamente il risultato del jump non è ancora arrivato), dunque con il jump perdo 2 cicli che avrei
potuto utilizzare ma che non posso in nessun modo riempire con nulla→control hazard (caso
peggiore in assoluto, ovvero quello in cui devo aspettare la fine dell’esecuzione per sapere
3
l’istruzione successiva da fetchare). Se un’istruzione fosse stata fetchata erroneamente occorre
eseguire uno squashing (cancellazione). Nel caso di questo control hazard il throughput diminuisce.
ARCHITETTURE ARM
3 grandi classi (CORTEX-M, CORTEX-R, CORTEX-A), esse identificano varie complessità. Quelle della
classe M sono i più semplici (basso costo e peggiori performance). Ci sono sottoclassi, nella CORTEX-
M (quella che considereremo) ce ne sono alcune e quello con cui lavoreremo è l’M4 uno di quelli
più performanti della classe). L’ISA di questi processori si è sviluppato nel tempo, i processori M
usano la versione 7 dell’IS dell’ARM, abbastanza semplice e poi superata dalla 8 (che comprende la
7 aggiungendo ulteriori features). CORTEX-M4 abbastanza capace di fare calcoli.
Il CORTEX-M3 è tutto quanto l’insieme di rettangoli, il processore invece è il rettangolino piccolo
“ARM core”. Una parte dei rettangoli contiene unità hardware necessarie per unità esterne che
vogliono interfacciarsi col processore per fare debug o avere informazioni sulle azioni. I rettangoli
in basso sono necessari a gestire le interfacce con bus. Il Configurable NVIC è l’interrupt controller
che riceve segnali dall’esterno (smetti di fare quel che stai facendo e fai altro, che può essere più
urgente). Memory protection unit: blocco di hardware che serve a controllare gli indirizzi a cui il
processore accede (se il processore va al di fuori degli indirizzi consentiti viene bloccato).
Figura 2 - Fasi delle istruzioni di un CORTEX M3
Stadio di decode:
• Instruction decode e lettura dei registri
• Branch unit: gestisce i branch, la freccia indietro indica che se per il branch, in fase di decode,
si sa già dove va a saltare, si riduce il numero di stalli perché l’info viene comunicata subito
al fetch
• Address generation unit: genera gli indirizzi dei registri utilizzati dalle istruzioni
Stadio di execute la più complessa:
• Generazione indirizzo verso la memoria & attesa dei dati provenienti dalla memoria (Address
Phase & Write Back e Data Phase Load/Store & Branch)
• Moltiplicazione e divisione: sono operazioni che richiedono più di 3 cicli (assieme alle load e
store).
• Shift, ALU e Branch
Il CORTEX-M4 ha un’unità aggiuntiva hardware esterna al processore (facoltativa): floating point
unit (gestisce le istruzioni floating point o a virgola mobile), oltre ad avere più istruzioni eseguibili
4
(istruzioni SIMD ovvero Single Instruction Multiple Data e altre istruzioni DSP ovvero Digital Signal
Processing).
Il CORTEX-M7 può eseguire due istruzioni in parallelo (superscalare) e ha le caches.
Il microcontrollore contiene memorie on chip, blocchi analogici (oscillatore per il clock), sensori (di
temperatura), oltre al processore. Watchdog: guardiano dell’operato del processore, se il
processore non comunica al watchdog la sua attività ogni intervallo di tempo specifico per più volte
consecutive, il watchdog lo arresta.
SECONDO BLOCCO SLIDE (02-ArchiARM2)
ARM CORTEX-M3/M4 INSTRUCTION SET & ARCHITECTURE
Nel Cortex M4 sono supportati due formati di istruzioni: 16 bit (comprendono le istruzioni più
importanti) e 32 bit (comprendono le istruzioni meno importanti). Ciò consente di avere un mix tra
le due tipologie (possono presentarsi casi in cui una istruzione a 32 bit che viene fetchata sia in realtà
composta da 2 istruzioni a 16 bit) che permette un aumento del 25% della prestazione del
processore e una riduzione della memoria di ¼ (ovvero del 25%). Il codice che viene generato dal
compilatore con tale instruction set Thumb-2 riesce a mischiare le istruzioni come necessario, senza
necessità di cambiarne la modalità operativa (le vecchie versioni del processore dovevano passare
da modalità a 16 bit a modalità a 32 bit con un’istruzione dedicata). Il nuovo approccio del
processore ha però anche alcuni svantaggi:
• I vecchi processori ARM che non mixavano automaticamente le istruzioni avevano un codice
differente che non può essere riutilizzato con le nuove versioni
• il processo di decodifica è più complesso, ad ogni fetch il processore carica sempre 32 bit
(prendendo un’unica istruzione o l’unione di due da 16 bit). Si potrebbe allora verificare un
fenomeno di disallineamento, quindi occorre una complessa decodifica che permetta, dopo
il fetch, di riunire le istruzioni separate erroneamente
Se un processore collegato a un sensore non riceve per alcuni istanti informazioni o istruzioni da
eseguire, esso deve entrare in una delle sleep modes per ridurre il consumo: WFI (Wait For Interact)
e WFE (Wait For Event). Il processore fornito dalla ARM può essere utilizzato in varie tecnologie
(180 nm, 90nm, 40nm ove il numero rappresenta la corrispondente lunghezza del transistore)
ognuna con consumi differenti, infatti se la tensione di alimentazione necessaria è minore,
ovviamente è minore il consumo di potenza (si caratterizza in µW/MHz, ovvero il consumo mostrato
è relativo al processore cloccato a 1MHz).
Prefetch buffer: crea una piccola provvista di istruzioni non ancora codificate (per aiutare nelle
situazioni di disallineamento), esso può solo fetchare sequenzialmente non alla destinazione di un
branch.
Branch speculation: speculazione dovuta ad un’incertezza, infatti non conoscendo ancora la
posizione del branch, è possibile prevederla e andare avanti ad eseguire istruzioni in sequenza (la
speculazione riguarda il branch taken o il branch not taken, sbagliando la previsione le istruzioni
che si vanno a perdere sono soltanto quelle).
Branch forwarding: se la destinazione del branch è nota dalla fase della decodifica possiamo
utilizzare l’informazione e avanzare direttamente dove indicato, non perdendo i due cicli di norma
necessari. 5
Adjust del branch: è il caso peggiore del branch, ovvero quello in cui avviene il calcolo dell’indirizzo,
il salvataggio nel link register di tale indirizzo, l’arrivo in destinazione non allineata a una parola e
dunque occorre un ulteriore ciclo per andare in decode con l’istruzione successiva.
I microcontrollori ARM hanno 7 diverse modalità d’utilizzo, in ognuna delle quali il microprocessore
opera con un diverso stack e diversi registri, il che permette ad esso di lavorare in ambienti isolati
con assenza di interferenza tra le varie modes:
• USER: modalità non privilegiata che si ha quando sul processore gira un programma scritto
da utente, ovvero viene eseguito il codice utente. Qui il processore ha accesso ad aree di
memoria e registri determinate e controllate dalla memory protection unit. Qualora si
verifichino eventi eccezionali, come interrupt o eccezioni software, si verifica il passaggio in
modalità exception (impossibili per il processore da accedere forzatamente, ma solo in caso
di eventi eccezionali).
• 5 EXCEPTION MODES: modalità accedute dal processore in caso si verifichino eventi
eccezionali, come interrupt o eccezioni software. I programmi che eseguono in queste
modalità privilegiate possono accedere a tutte le aree della memoria. Nelle modalità
privilegiate c’è un set di registri diverso da quello della modalità non privilegiata, dunque ci
sono in realtà in totale 32 registri nell’ARM (16 adibiti alla modalità non privilegiata e 16
adibiti alla modalità privilegiata). Conseguentemente tali programmi exception non hanno
bisogno di salvare i registri programmi utente in memoria, percui si accorcia il tempo di
attivazione degli handler.
o FIQ: modalità acceduta in caso di interruzioni di alta priorità.
o IRQ: modalità acceduta in caso di interruzioni di bassa priorità.
o ABORT: modalità acceduta quando il processore tenta di accedere a una regione di
memoria proibita. In questo caso la MPU genera quindi un evento di Abort e fa
entrare il processore nell’omonima modalità (qui poi ci sarà un codice specifico,
solitamente di terminazione del programma che ha generato l’eccezione).
o UNDEF: modalità acceduta se il processore decodifica un’istruzione che non riesce a
riconoscere perché corrotta (codice più comune è la terminazione del programma
che ha generato l’eccezione). Tale modalità viene acceduta in corrispondenza di
eventi rari.
o SUPERVISOR MODE: modalità di pieno controllo del sistema acceduta quando il
processore comincia a eseguire dallo stato di boot per poi uscirne ed entrare in
modalità utente attraverso una specifica istruzione. C’è un altro modo per entrare in
modalità supervisore, ovvero il
caso in cui si abbia una SWI
(software interrupt), caso in cui
il codice utente vuole chiedere
un’autorizzazione al SO per
accedere a zone non consentite.
• SYSTEM MODE: analogamente alla
supervisor mode è una modalità
privilegiata, ma i registri disponibili al Figura 3 - Diagramma degli stati delle modalità operative
processore sono quelli della user mode. 6
I 16 registri della modalità privilegiata e i 16 registri della modalità non privilegiata sono omonimi
ma, come detto, diversi. La maggior parte di essi sono registri General Purpose (sono 13, dunque
pochi rispetto alla quantità di dati da elaborare ma sufficienti a mantenere una ridotta
dimensione del processore. Verranno usati solo se immediatamente necessari per operazioni di
input e output. Quando il contenuto di uno dei registri non è utilizzato viene effettuata una store
per poterlo dunque svuotare e riutilizzare. Sono pochi per tenere contenuta la dimensione del
processore. Quando il processore esegue istruzioni a 16 bit vede solo la sezione degli 8 Low
Register R0…R7), gli altri 3 registri sono speciali e servono per la gesti
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Appunti completi del corso di Calcolatori elettronici
-
Appunti Sistemi elettronici
-
Appunti Economia dei Sistemi Industriali
-
Appunti Elettronica (Sistemi elettronici, tecnologie e misure)