• Non ci sono risultati.

Per dare un’idea

N/A
N/A
Protected

Academic year: 2021

Condividi "Per dare un’idea"

Copied!
74
0
0

Testo completo

(1)

Architettura ARM

(Advanced Risc Machines)

G. Bucci (2011)

(2)

ARM

E’ una architettura RISC a 32 bit

Estremamente semplice, basso consumo

Licenziata a una lunga lista di produttori: ARM Ltd non produce direttamente, vende licenze, ovvero IP (Intellectual Properties)

Usata praticamente in tutti i telefonini intelligenti e su altri apparati come iPad

Nel suo mercato di elezione non ha concorrenti:

Primi 2008: superato il traguardo dei 10 G processori prodotti

Primavera 2011: ormai superato il traguardo dei 20 G prodotti

Primavera 2011: oltre 10 M di pezzi al giorno

(3)

Per dare un’idea

Quella sotto è pubblicità da un sito ARM (giugno 2011)

(4)

Siamo circondati !

(5)

Letteratura

Su ARM esiste un’ampia letteratura

Su wikipedia si trova la storia e la lista dei modelli sviluppati nel corso del tempo, con cenni circa le loro caratteristiche

Sul sito della società http://www.arm.com/ si trova una

consistente documentazione, compresi i manuali dei vari modelli, note applicative, documentazione on-line interattiva

All’indirizzo

http://www.cse.unsw.edu.au/~cs9244/06/seminars/08-

leonidr.pdf si trova un articolo che descrive in modo sintetico e leggibile l’architettura ARM

(6)

Storia

Acorn Computers è stata fondata nel 1978 a Cambridge (UK).

Sollecitata da un progetto BBC ha prodotto un computer

(chiamato BBC) pensato a fini educativi; in esso veniva usata la CPU 6502 la stessa del primo Apple; non aveva HD

Agli inizi degli anni ’80 decise passare a CPU più potenti

Scartate CPU di mercato venne lanciato un progetto per la

produzione di una CPU RISC ispirandosi fortemente al progetto RISC 1 dell’Università di Berkley (sviluppato nel contesto di un corso universitario)

Nell’ottobre 1983 venne lanciato il progetto Acorn RISC Machine; il primo campione arrivò ad aprile 1085

(7)

Apple sceglie ARM

Nel 1990 Apple sceglie ARM per produrre il suo PDA (denominato Netwon)

ARM è alla versione v2

Tra Apple, Acorn e VLSI Technology viene progettata una nuova versione (la v3) che esce nel 1992

Il dispositivo usato da Apple si chiamava ARM610, aveva una cache integrata e forniva 16 MIPS a 20 MHz con solo 30.000 transistori

Attualmente la società si chiama ARM Ltd (Advanced Risc Machines) ed è compartecipata dalle tre società

(8)

Famiglie, versione, dispositivo

La denominazione è un po’ confusa

………Seguono altre famiglie e versioni

Attualmente la versione è la v7

(9)

Cortex

Si chiama così la famiglia più recente

Vastissimo numero di produttori/utilizzatori

A4 (iPad) di Apple è un Cortex

Basata sulla versione V7 dell’architettura

Tre profili:

"Application" profile: Cortex-A series

"Real-time" profile: Cortex-R series

"Microcontroller" profile: Cortex-M series

(10)

Lo stato attuale

(11)

Licenziatari Presenti (e/o passati)

Alcatel-Lucent, Apple Inc., Atmel, Broadcom, Cirrus Logic, Digital Equipment Corporation, Freescale, Intel (through DEC), LG, Marvell Technology Group, Microsoft, NEC, Nuvoton, Nvidia, NXP (previously Philips), Oki, ON Semiconductor, Qualcomm, Samsung, Sharp,

STMicroelectronics, Symbios Logic, Texas Instruments, VLSI Technology, Yamaha and ZiiLABS.

Le architetture correnti sono ARM7, ARM9, ARM11 e Cortex.

Notable ARM processors developed by licensees include DEC

StrongARM, Freescale i.MX, Marvell (formerly Intel) XScale, Nvidia Tegra, ST-Ericsson Nomadik, Qualcomm Snapdragon, the Texas

Instruments OMAP product line, the Samsung Hummingbird and the Apple A4.

(12)

IP core

Intellectual Property Core: è una parte di logica riusabile, una standard cell o un chip layout di cui qualcuno

possiede la proprietà intellettuale

Può essere data in licenza per essere usata come

componente di base attorno al quale viene costruito uno specifico ASIC / FPGA

Tipicamente: un produttore impiega un ARM core attorno al quale viene progettata la logica addizionale per un dispositivo (anche una CPU) , la cui realizzazione viene fatta in casa o affidata a una semiconductor farm

(13)

Licenze

Perpetua

Diritto di usare la tecnologia ARM (progetto e produzione) indefinitamente

A termine

Diritto di progettare e sviluppare su un periodo di tempo, diritto a tempo indefinito alla produzione

A prodotto

Diritto a progettare e sviluppare su un periodo di tempo un dato prodotto, diritto a tempo indefinito alla produzione

(14)

Altri servizi/strumenti offerti da ARM

Possibilità per chi non possiede la “fonderia” di appoggiarsi su “foundries” approvate da ARM

Possibilità di valutare soluzioni ARM, sviluppare prototipi prima di passare alla licenza

C’è anche un programma universitario che consente di avere accesso a tool e kit di sviluppo

Standard cells

Fast development

(15)

Architettura ARM

(16)

La caratteristica fondamentale: il basso consumo

Per dare un’idea:

Il modello PXA255 XScale a 400MHz aveva prestazioni comparabili con quelle di un Pentium 2 a 300MHz, ma con un consumo di energia elettrica 50 volte inferiore

Xscale è una famiglia di processori sviluppati da Intel

Si basa sulla versione architetturale V5

Incorpora una pipeline a 7 stadi

(non più Intel)

(17)

Caratteristiche

Buon numero di registri di CPU (in tutto 37) a 32 bit

Solo operazioni di Load e Store verso la memoria

indirizzamento determinato esclusivamente dal contenuto dei registri e da eventuali campi nell’istruzione;

Operazioni di manipolazione dei dati esclusivamente tra registri di CPU

Istruzioni su 32 bit

formati istruzioni con campi in posizione e di misura fissi, per facilitare la decodifica; tutte le

modalità indirizzamento autoincrement e autodecrement

esecuzione condizionata di quasi tutte le istruzioni del repertorio

controllo sia della ALU sia degli shifter

(18)

…caratteristiche

Previsone impiego coprocessori

Allo scopo di poter estendere l’architettura ARM (repertorio di istruzioni) per specifici campio applicativi (ad esempio DSP, Digital Signal

Processing).

Modalità di funzionamento Thumb

Una sorta di superstato

Le istruzioni Thumb sono codificate su 16 bit (aumenta la densità del codice)

In certe situazioni (p.e., risposta alle eccezioni) in cui, se la macchina è in modo Thumb, essa passa automaticamente al modo ARM

Minor numero di registri

Col Thumb2 le istruzioni ARM e Thumb sono liberamente mescolabili

Estensione Jazelle

Esecuzione diretta del byte code dei programmi java.

Interfaccia di debug

Collegamento diretto alla CPU di un apparato di debugging

Altro…. (multimedia, SIMD ….)

(19)

Stati del processore

(20)

Modello di programmazione

(21)

Registri

16 registri da 32 bit denominati R0-R15

R0-R12 sono registri di uso generale;

R13 viene usualmente usato come Stack Pointer (SP), ma l’architettura non forza tale impiego

R14 ha la funzione (architetturale) di subroutine Link Register (LR) ; ci viene salvato l’indirizzo di ritorno (ovvero il contenuto del registro R15 ) quando viene eseguita l’istruzione BL (Branch and Link)

R15 ha la funzione architetturale di Program Counter;

In tre registri R13, R14, R15 possono comunque essere manipolati come registri di uso generale.

Un registro di stato CPSR (Current Program Status Register )

20 registri sono “duplicati” (banked) e sono specifici dei modi corrispondenti

(22)

PC è un registro come un altro…

L’istruzione BL (Branch and Link) serve come chiamata di subroutine

Salva l’indirizzo di ritorno in r14 (lr)

Il ritorno dalla routine si fa copiando r14 in r15:

MOV r15, r14

E’ più intuitivo scrivere MOV pc,lr

Simboli com pc, lr o sp non sono riconosciuti

direttamente dall’assemblatore, occorre definirli con una direttiva (pc RN r15)

(23)

Sottoprogramma

R13 usato come stack pointer

R14 usabile se prima si salva il suo contenuto per il ritorno

Va preventivamente salvato se il sottoprogramma ne chiama un altro (la chiamata cambia il contenuto di R14)

R15 usato solo come PC

R0-R12 usati variamente per passare parametri e per le variabili locali (se non bastano usare lo stack)

Al ritorno lo stack deve essere com’era prima della chiamata

(24)

Current Program Status Register (CPSR)

4 condizioni (Negative, Carry, Zero e oVerow);

T distingue tra ARM e Thumb

I e F abilitano le interruzioni normali (I) and veloci (F)

M4-M0 identificano il modo di funzionamento.

(25)

Eccezioni

Nella terminologia ARM sono chiamate così le interruzioni esterne, le eccezioni classiche e le

interruzioni software

(26)

Eccezioni

(27)

Eccezioni

Risposta all’eccezione di modo m

CPSR viene copiato in SPSR_m

CPSR viene modificato a riflettere il nuovo modo (se del caso I e F vengono disasseriti)

PC (r15) viene salvato in LR_m (r14_m)

PC viene modificato con il numero corrispondente all’indirizzo del vettore di interruzione

I vettori di interruzione stanno nella parte bassa

Un vettore deve contenere l’istruzione di salto all’handler dell’eccezione

(28)

Vettori di interruzione

(29)

Vettori di interruzione

(30)

Eccezione di Reset

Ha l’effetto di

Passare al modo Supervisore

Disabilitare le interruzioni normali e veloci (portando a 1 i due bit I e F)

Azzerare il bit di stato T (riporta allo stato ARM qualora la CPU fosse in stato Thumb)

Forzare l’esecuzione dell’istruzione alla posizione 0x00

Dopo il Reset il contenuto dei registri è indeterminato

Non deve essere effettuato il ritorno in quanto è da considerarsi come l’avvio della macchina

(31)

Eccezione software

(32)

Software Interrupt (SWI)

Porta la macchina in stato Supervisor

Il formato dell’istruzione prevede un campo di 24 bit in cui è scritto un numero (della funzione da chiamare)

E’ responsabilità dell’handler estrarre il numero e saltare alla funzione appropriata. Ecco il modo

LDR r0, [lr, #-4] ;r0 <- Codice della SWI chiamante BIC r0,r0,#0xff000000 ; isolamento #funzione

Deve seguire un salto attraverso un tabella contenente gli indirizzi delle funzioni

(33)

Ritorno dalle eccezioni

Per tornare al programma interrotto, l’exception handler

Ripristina CPSR da SPSR_m (attenzione: riabilita !!!)

Ripristina PC da LR_m

Attenzione: all’atto dell’eccezione in LR_m viene salvato un valore di PC che non è sempre lo stesso per tutti i tipi di eccezione

Deriva dal fatto che c’è una pipeline e che PC può essere stato aggiornato o no a seconda di dove l’eccezione si manifesta

(34)

PC salvato/ritorno

p Ecc PC Salvato Ritorno

1 Reset --- ---

2 Data Abort r14_abt = PC+8 SUBS PC,r14_abt,#8

3 FIQ r14_fiq = PC+4 SUBS PC,r14_fiq,#4

4 IRQ r14_irq = PC+4 SUBS PC,r14_irq,#4 5 Prefetch Abort r14_abt = PC+4 SUBS PC,r14_abt,#4

6 SWI r14_svc = PC+4 MOVS PC,r14_svc

6 Undefined instr r14_und = PC+4 MOVS PC,r14_und

Qui PC indica il PC dell’istruzione che determina l’eccezione

(35)

PC salvato/ritorno

p Ecc PC Salvato Ritorno

1 Reset --- ---

2 Data Abort r14_abt = PC+8 SUBS PC,r14_abt,#8

3 FIQ r14_fiq = PC+4 SUBS PC,r14_fiq,#4

4 IRQ r14_irq = PC+4 SUBS PC,r14_irq,#4 5 Prefetch Abort r14_abt = PC+4 SUBS PC,r14_abt,#4

6 SWI r14_svc = PC+4 MOVS PC,r14_svc

6 Undefined instr r14_und = PC+4 MOVS PC,r14_und

Viene salvato il PC dell’istruzione successiva

(36)

PC salvato/ritorno

p Ecc PC Salvato Ritorno

1 Reset --- ---

2 Data Abort r14_abt = PC+8 SUBS PC,r14_abt,#8

3 FIQ r14_fiq = PC+4 SUBS PC,r14_fiq,#4

4 IRQ r14_irq = PC+4 SUBS PC,r14_irq,#4 5 Prefetch Abort r14_abt = PC+4 SUBS PC,r14_abt,#4

6 SWI r14_svc = PC+4 MOVS PC,r14_svc

6 Undefined instr r14_und = PC+4 MOVS PC,r14_und

Quando l’interruzione viene servita il PC è stato

incrementato di 4 rispetto all’ultima istruzione completata, per questo occorre riportarlo indietro

(37)

PC salvato/ritorno

p Ecc PC Salvato Ritorno

1 Reset --- ---

2 Data Abort r14_abt = PC+8 SUBS PC,r14_abt,#8

3 FIQ r14_fiq = PC+4 SUBS PC,r14_fiq,#4

4 IRQ r14_irq = PC+4 SUBS PC,r14_irq,#4 5 Prefetch Abort r14_abt = PC+4 SUBS PC,r14_abt,#4

6 SWI r14_svc = PC+4 MOVS PC,r14_svc

6 Undefined instr r14_und = PC+4 MOVS PC,r14_und

Data Abort si manifesta solo quando l’istruzione è in fondo alla pipeline e PC è già stato incrementato 2 volte

(38)

Interruzioni esterne

(39)

Handler interruzioni esterne

Memo: Su IRQ viene salvato il PC di ritorno in r14_irq (lr_irq) e CPSR in SPSR_irq

Politica “Una alla volta per carità !”

Salvare i registri che verranno toccati

Identificare la specifica interruzione e saltare al ramo corrispondente

Ripristinare i registri e CPSR

Tornare al punto dell’interruzione

Per quanto apparentemente semplice nasconde delle insidie

(40)

..Una alla volta per carità

1. Salvare i registri che verranno toccati

2. Identificare la specifica interruzione e saltare al ramo corrispondente

3. Ripristinare i registri e CPSR

4. Tornare al punto dell’interruzione

C’è l’istruzione di Store Multiple (attraverso un registro) che fa tutto da sola. Esempio:

STMFD sp!, {r0-r7,lr}

Salva ordinatamente i registri da r0 a r7 e r14 (indirizzo di ritorno) a partire dalla posizione individuata inizialmente da sp (cioè r13 del mode in atto, ovvero irq).

(FD: Full Descending stack)

(41)

..Una alla volta per carità

1. Salvare i registri che verranno toccati

2. Identificare la specifica interruzione e saltare al ramo corrispondente

3. Ripristinare i registri e CPSR

4. Tornare al punto dell’interruzione

Richiede la lettura del mondo esterno per identificare qual è la specifica interruzione e il salto al tratto di codice ad essa associato via una

tabella di indirizzamento

(42)

..Una alla volta per carità

1. Salvare i registri che verranno toccati

2. Identificare la specifica interruzione e saltare al ramo corrispondente

3. Ripristinare i registri e CPSR

4. Tornare al punto dell’interruzione

Per ripristinare un blocco di registri c’è l’istruzione Load Multiple duale della precedente. Esempio LDMFD sp!,{r0-r7}.

Per il ripristino di CPSR si potrebbe utilizzare l’istruzione MSR che scrive in CPSR (facendole scrivere il valore di SPSR).

Ma qui c’è l’insidia !!

(43)

..l’insidia

1. Salvare i registri che verranno toccati

2. Identificare la specifica interruzione e saltare al ramo corrispondente

3. Ripristinare i registri e CPSR

4. Tornare al punto dell’interruzione (con mov pc,lr)

Se CPSR viene ripristinato lo stato è quello che c’era al momento

dell’interruzione, dunque il sistema di interruzione ritorna abilitato. Se c’è in agguato un’interruzione questa fa rientrare l’handler e sovrascrive r14: il suo contenuto è perso!!

Bisogna rendere 3 e 4 indivisibili. ….

Per fortuna l’istruzione LDM prevede il “qualificatore” ^ che comporta

(44)

Per inciso

(sviluppo stack)

In su In giù

(45)

Schema per le interruzioni rientranti

Sull’interruzione occorre:

1. Salvare l’indirizzo di ritorno sullo stack (di modo irq) 2. Salvare i registri che verranno manipolati e SPSR_irq 3. Azzerare la richiesta di interruzione

4 . Riabilitare il sistema di interruzione (bit I di CPSR) 5. …. Quel che c’è da fare

6 . Disabilitare il sistema di interruzione

7. Ripristinare i registri e SPSR_irq e tornare all’indirizzo salvato

le cose non sono così

(46)

Garantire il ristabilirsi dello stato

1. Salvare l’indirizzo di ritorno sullo stack

2. Salvare i registri che verranno manipolati e SPSR_irq 3. Azzerare la richiesta di interruzione

4 . Riabilitare il sistema di interruzione 5. …. Quel che c’è da fare

6. Disabilitare il sistema di interruzione

7. Ripristinare i registri e SPSR_irq e tornare all’indirizzo salvato

Onde evitare che dopo il ripristino dei registri si inserisca un’altra interruzione prima che si compia il

salto (ci si riporta al caso precedente)

(47)

NON basta: c’è ancora un problema

1. Salvare l’indirizzo di ritorno sullo stack

2. Salvare i registri che verranno manipolati e SPSR_irq 3. Azzerare la richiesta di interruzione

4 . Riabilitare il sistema di interruzione 5. …. Quel che c’è da fare

6 . Disabilitare il sistema di interruzione

7. Ripristinare i registri e SPSR_irq e tornare all’indirizzo salvato

Se qui dentro c’è un BL (call) e poi arriva una nuova interruzione siamo fritti: si perde l’indirizzo di ritorno a dopo il BL !

(48)

Soluzione del problema del BL

Rinunciare a fare le chiamate alle soubroutine entro l’handler (rientrante) delle eccezioni. Inaccettabile

Sostituire i punti da 4 a 6 con

a) Passare a User mode

b) Salvare i registri di User mode

c) Riabilitare il sistema di interruzione

d) Chiamare la subroutine (quel che c’è da fare)

e) Al ritorno dalla subroutine rimettere i registri di User mode f) Tornare a IRQ mode disabilitando il sistema di interruzione

(49)

….Soluzione del problema del BL

Sostituire i punti da 4 a 6 con

a) Passare a User mode

b) Salvare i registri di User mode

c) Riabilitare il sistema di interruzione

d) Chiamare la subroutine (quel che c’è da fare)

e) Al ritorno dalla subroutine rimettere i registri di User mode f) Tornare a IRQ mode disabilitando il sistema di interruzione

La chiamata modifica LR_user e quindi, se arriva un’altra interruzione, questa va a modificare LR_irq (già salvato) e non

fa perdere l’indirizzo di ritorno dalla subroutine.

Il processo si può ripetere quante volte si vuole

(50)

…Non è finita

La soluzione precedente ha un problema:

Lo User mode non è privilegiato e non consente di andare a toccare, per esempio, CPSR

Nella scrittura dell’handler potrebbe essere utile usare istruzioni privilegiate

Così era fino alla versione v4 (esclusa) quando mancava il System mode

Con la v4 è stato introdotto il modo System,

equivalente al modo User (stessi registri), ma abilitato alle operazioni privilegiate

Nello schema precedente sostituire “User mode” con “System mode”

(51)

Formato istruzioni

(52)

Formato Istruzioni

(53)

Esempio

(54)

Esecuzione condizionata

Il campo Cond contiene una condizione (messa lì dall’assemblatore in base al codice di istruzione)

Ad esempio SUBGT r1,r2,r3 è il codice di sub con la condizione greater then codificata nel campo Cond

L’istruzione viene eseguita solo se in quel momento CPSR contiene la medesima condizione, altrimenti l’istruzione non viene eseguita

E’ un aspetto caratteristico di questa architettura

(55)

Algoritmo di Euclide per il MCD

(56)

Macchine convenzionali

MCD cmp r0,r1 ;raggiunta la fine?

beq FINE

blt MIN ; if r0 > r1 salta sub r0,r0,r1 ;r0 <- r0-r1

b MCD ;altro giro MIN sub r1,r1,r0 ;r1 <- r1-r0

b MCD

FINE

(57)

ARM

MCD cmp r0,r1 ;if r0 > r1

subgt r0,r0,r1 ;then r0 <- r0-r1 sublt r1,r1,r0 ;else r1 <- r1-r0

bne MCD ;raggiunta la fine?

Consente un codice molto più compatto

(58)

La Pipeline

(59)

Organizzazione (ARM7TDMI) (v4)

(60)

La pipeline

A tre stadi (v3)

Nelle versioni correnti gli stadi sono molti di più

(61)

Con una variazione

Le istruzioni che fanno accesso alla memoria richiedono 4 cicli

L’istruzione seguente ha un stallo

Il data transfer è in conflitto (strutturale) con il fetch

(62)

Con una variazione

Le istruzioni che fanno accesso alla memoria richiedono 4 cicli

L’istruzione seguente ha un stallo

Il data transfer è in conflitto (strutturale) con il fetch

(63)

C’è molto di più (

Esempio ARM1156T2-S

)

Architettura v6. Repertorio ARM e Thumb 2, Istruzioni SIMD su 16-bit o 8-bit registri da 32-bit

Cortex A5 ha sostanzialmente

(64)

Coprocessori

(65)

Coprocessori

Meccanismo per estendere il repertorio di istruzioni

FPU, DSP, ecc. realizzati come coprocessori

Il repertorio di istruzioni del coprocessore è disgiunto rispetto a quello della CPU

In presenza di un codice di istruzione eseguibile da un coprocessore si instaura un meccanismo che porta il coprocessore a eseguire l’istruzione

Se il coprocessore non è presente si ha eccezione (undefined), che può essere eventualmente usata per emulare un

coprocessore

Occorre un protocollo di interazione

(66)

Coprocessore ARM

Tipicamente un coprocessore contiene

Una pipeline istruzioni (pipeline follower)

La logica di decodifica delle istruzioni

La logica di handshake

Un banco di registri

La specifica logica di elaborazione

(67)

Hand-shaking

Il coprocessore osserva le istruzioni di cui la CPU fa il fetch e mantiene una pipeline sincronizzata con quella della CPU

Se in fase di decodifica vede un’istruzione che può eseguire

(deve essere nel suo repertorio e contenere codificato lo stesso ID del processore) asserisce CPA (basso)

La CPU risponde asserendo CPnI (basso) abilitando

Se non risponde il coprocessore non deve eseguire

Il coprocessore asserisce CPB (basso) quando può trattare l’istruzione

NB: l’istruzione ha un campo in cui è codificato l’ID del coprocessore per il quale essa è intesa

(68)

ARM7TDMI

Hand-shaking coprocessore

(69)

… Hand shaking

(70)

Assenza del coprocessore

Se CPA non viene portato basso significa assenza di qualunque coprocessore

Si genera un’eccezione di istruzione non definita

Mentre CPA è basso anche CPB deve passare basso a indicare che il coprocessore è libero

(71)

… Hand shaking

(72)

Tre classi di istruzione per il coprocessore

Data processing instructions.

Eseguite direttamente dal coprocessore

Load-store instructions

Trasferiscono dati tra registri del coprocessore e memoria. In questo caso la CPU avvia l’inizio del trasferimento ponendo

l’indirizzo di memoria sul bus; il processore è responsabile della continuazione dell’operazione leggendo le parole richieste (la CPU non conosce le dimensioni dei registri del coprocessore)

Register transfer instructions

Trasferiscono dati tra registri del coprocessore e registri della CPU; in questo caso vengono sempre trasferite parole di 32 bit

(73)

Coprocessori ID riservati

(74)

Conclusioni

Architettura semplice, ma potente

ECC.

Riferimenti

Documenti correlati

 Nonostante la malattia rappresenti la 4° causa di morte per cancro, la ricerca.. sul tumore del pancreas riceve meno del 2% di tutti i finanziamenti per

[r]

Lo scrivo a Beirut dove, forse per la vicinanza della morte, ancora a fior di terra, tutto è più vero che in Francia: tutto sembra acca- dere come se fosse

Essi sono essenzialmente funzione dell area A, del perimetro P e della lunghezza dell asta principale L..

L’ escoriosi della vite, causa- ta da Phomopsis viticola Sacc., nota anche come necrosi corticale, è una malattia fun- gina conosciuta sin dagli anni 50 che ha assunto, in

[r]

La  possibilità  offerta  dalle  ultime  generazioni  di  microscopi  a  scansione  e  trasmissione  elettronica  consente  di  spiare  la  struttura  intima 

[r]