03.a Introduzione ad ARM e al processore S3C2440 C. Fantozzi, A. Gardich (revisione di S. Congiu, M.Moro) Che cosa è ARM? ARM = Advanced RISC Machine 1 ARM Ltd non produce microprocessori: progetta e vende proprietà intellettuale ARM è una architettura: insieme dei registri e delle istruzioni disponibili modi d indirizzamento gestione delle interruzioni Esistono molte versioni dell architettura, e molti processori per versione
ARM nella vita quotidiana: esempi 2 Nintendo DSi (un ARM7 e un ARM9) Netgear WGR614 (Marvell ARM9) Apple iphone (ARM11) Molte calcolatrici e palmari Architettura ARM: versioni Sono state definite 7 versioni (da 1 a 7) del set di istruzioni ARM. 3 Per ogni versione esistono varianti, identificate da lettere: T (Thumb: istruzioni da 16 bit) M (Multiply: con prodotto da 64 bit) E (Enhanced: con istruzioni DSP per applicazioni multimediali Le più diffuse nei sistemi embedded portatili (smartphones, Personal Digital Assistants, ) sono le versioni 4 e 5.
Architettura ARM: famiglie Le famiglie di processori ARM attualmente più diffuse sono: 4 FAMIGLIA ARM7 ARM9 ARM9E ARM10E XScale ARM11 Cortex VERSIONE CORE ARMv3 ARMv4T ARMv5TE ARMv5TE ARMv5TE ARMv6 ARMv7-x (anche ARMv6-M) La famiglia Cortex Presentata nel 2005, si caratterizza per essere costituita da un insieme di unità funzionali collegabili tra loro Uno specifico processore ne può realizzare un sottoinsieme serie A (application) è quella più completa (computer, smartphone, ecc.) serie R (realtime), floating point opzionale, cache configurabile, MMU più semplice serie M (microcontroller) è quella più semplice, cache assente e MMU opzionale Le diverse configurazioni possono essere a singolo core o multicore Alcune caratteristiche specifiche dell architettura v7 unità NEON per operazioni SIMD su 64 o 128 bit unità floating point con più registri e nuove operazioni set di istruzioni Thumb per accelerare l esecuzione di macchine virtuali (es. JVM) modalità di esecuzione sicura (TrustZone) 5
Cortex 6 La famiglia Cortex 7
Samsung S3C24xx Application Processors 8 Applicazioni Mobile Computing Portable Network Devices Portable media players Edutainment toys E-book readers Mobile Communication Smartphones Obiettivi di progetto Insieme completo di periferiche on-chip Elevate prestazioni Basso consumo Rapporto prezzo/prestazioni S3C2440: specifiche tecniche 9 Processore RISC a 32 bit Architettura ARMv4T Core ARM 920T; thumb i.s. Memory Management Unit Cache (instruction & data) Nessun HW floating point Funzionalità integrate: ADC a 10 bit, 8 canali; 3 porte seriali; USB host & device; controller LCD, touch screen; Interfacce per sensori CMOS, schede di memoria, audio, ecc. ecc. 14x14 mm 289-pin FBGA (Fine Ball Grid Array) Processo produttivo: 130 nm Frequenza: 533 MHz max Bus memoria: 100 MHz max Tensione di alimentazione 1.2V Consumo: 0,368W @ 400 MHz
S3C2440: schema a blocchi 10 ARMv4: caratteristiche 11 L architettura ARMv4 è a 32 bit word=32 bit (in memoria allineati ad indirizzi multipli di 4) halfword=16 bit (in memoria allineati ad indirizzi multipli di 2) byte =8 bit (singolarmente indirizzabili in memoria) 2 32 byte di memoria indirizzabili (4GB), ma S3C2440 supporta max 1 GB (8 banchi da 128 MB)
ARMv4: caratteristiche RISC 12 L architettura ARMv4 è di tipo RISC Numero elevato di registri (37 in tutto) Istruzioni con lunghezza fissa di 32 bit Le parole di estensione non esistono, Architettura load/store: ad esclusione di load e store, tutte le istruzioni operano su registri Modi di indirizzamento semplici: tutti gli indirizzi di memoria nelle istruzioni load/store sono specificati da informazioni contenute in registri o nei campi dell istruzione ARMv4: altre caratteristiche 13 Controllo sia dell ALU sia dello shifter, con tutte le istruzioni di elaborazione-dati Modalità di indirizzamento auto-incrementanti e auto-decrementanti (efficienza nei loop) Esecuzione condizionata specificabile in tutte le istruzioni Istruzioni di load e store multipli (più registri) Shift di n posizioni in un solo ciclo di clock Istruzioni a 3 operandi
Modi operativi User (USR): modo utente FIQ (FIQ): gestione veloce interruzioni IRQ (IRQ): gestione interruzioni Supervisor (SVC): modo protetto Abort (ABT): per gestione memoria Undefined (UND): emulaz. coprocessori System (SYS): usa risorse di USR senza limitazioni d accesso 14 I registri: panoramica 15
I registri R0-R13: registri di uso generale SP: stack pointer (R13) LR: link register (R14) Memorizza l indirizzo di ritorno da subroutine PC: program counter (R15) Punta all istruzione da eseguire 16 CPSR: Current Program Status Register Contiene i bit di stato SPSR: Saved Program Status Register Copia di CPSR prima del cambio di modo CPSR: bit utili Bit 0 4 (M): modo operativo (7 attualmente previsti) Bit 7 (I): interruzioni on/off (0/1) Bit 28 (V): indica errore di overflow (aritmetica con segno in complemento a 2) Bit 29 (C): indica il carry o riporto (overflow nell aritmetica senza segno) Bit 30 (Z): indica un risultato zero Bit 31 (N): indica un risultato negativo (aritmetica con segno in complemento a 2) Altri bit: Bit 5 (T): Thumb instruction set off/on (0/1) Bit 6 (F): fast IRQ on/off (0/1) Bit 7 (I): IRQ on/off (0/1) 17 Riservati
Big o Little Endian? 18 S3C2440 supporta tutte e 2 le modalità Il comportamento predefinito è little endian, secondo specifiche ARM Operazioni di I/O L I/O è di tipo memory mapped: i registri delle periferiche si trovano in locazioni di memoria predefinite 19 2 tipi di interruzioni: Normale Fast (vengono salvati meno registri) Hardware delle periferiche con accesso diretto alla memoria (DMA)
Classificazione delle istruzioni Accesso alla memoria Load / store tra memoria e registri 20 Elaborazione di dati (data processing) Operazioni di movimento tra registri Operazioni aritmetico-logiche Operazioni di confronto Controllo di flusso Branch (= salto ) con o senza condizione Le istruzioni ARMv4 prevede: - istruzioni di elaborazione dati a 3 operandi: uno (registro) per il risultato, due per gli operandi: SUB R2, R0, R1 @ R2=R0-R1 SUB R2, R0, R1, LSL #4 @ R2=R0-R1*16 - altre istruzioni a 2 operandi: uno per l op. destinazione, uno per l op. sorgente: MOV R2, R2, ASR #2 @ R2=R2/4 - altre istruzioni a 1 operando: ad es. le istruzioni di branch: B LAB2 21
Modifica dei bit di stato 22 Per default le istruzioni non modificano i bit di stato N,Z,C,V Per modificare i bit di stato si aggiunge il suffisso S al simbolo mnemonico dell istruzione: ADD R2, R0, R1 ADDS R2, R0, R1 @ non modifica NZCV @ modifica NZCV Non vale per le istruzioni di confronto! Istruzioni con condizione - 1 Aggiungendo specifici suffissi di condizione, l istruzione viene eseguita solo se i bit di condizione soddisfano quanto specificato 23 Esempi: MOVEQ R0, #0 poni R0=0 solo se Z=1 MOVNE R0, #0 esegui se Z=0 MOVGT R0, #0 esegui se Z=0 e N=V MOVLE R0, #0 esegui se Z=1 o N V MOVAL R0, #0 esegui sempre
Istruzioni con condizione - 2 Permettono di velocizzare il codice risparmiando salti condizionati mantenendo pieni i pipeline 24 CMP r0, #10 if (a > 10) return 0; MOVGT r0, #0 else return 1 MOVLE r0, #1 Nessun branch misprediction! Lista delle condizioni Estensione mnemonica Significato Flag di condizione Opcode [31:28] EQ Uguali Z=1 0000 NE Non uguali Z=0 0001 CS/HS Carry Attivato / Senza segno maggiore o uguale C=1 0010 CC/LO Carry Disattivato / Senza segno minore C=0 0011 MI Negativo N=1 0100 PL Positivo o Zero N=0 0101 VS Overflow V=1 0110 VC Non Overflow V=0 0111 HI Senza segno maggiore C=1 e Z=0 1000 LS Senza segno minore o uguale C=0 o Z=1 1001 GE Con segno maggiore o uguale N=V 1010 LT Con segno minore N!=V 1011 GT Con segno maggiore Z=0 e N=V 1100 LE Con segno minore o uguale Z=1 o N!=V 1101 AL Sempre (è il default) - 1110 NV Mai - 1111 25
I modi di indirizzamento Ogni categoria di istruzioni ha i propri: ci sono 4 classi di modi di indirizzamento. 26 RISC: niente indirizzamento assoluto (non usa puntatori in memoria, ma solo nei registri) indirizzamento in memoria (indiretto con registro) solo per le istruzioni LDR (load) e STR (store) Classi di indirizzamento Modo 1: per istruzioni di elaborazione dati ADC, ADD, AND, BIC, CMN, CMP, EOR, MOV, MVN, ORR, RSB, RSC, SBC, SUB, TEQ, TST 27 Modo 2: per Load&Store di word o unsigned byte LDR, LDRB, STR, STRB Modo 3: per L&S di halfword o signed byte LDRH, LDRSB, LDRSH, STRH Modo 4: per L&S di registri multipli LDMxx, STMxx
Istruzioni di elaborazione dati 28 3 indirizzi: <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand> <cond>: stabilisce l esecuzione condizionata S: stabilisce se modifica i bit di condizione <Rd>: destinazione <Rn>: primo operando <shifter_operand>: secondo operando esempio: addges R4, R3, R2 @ R4 R3+R2 Modo 1 (indirizz( indirizz.. per elaboraz.. dati) sintassi: <istruzione3op> Rd, Rn, <shifter_operand> <istruzione2op> Rd, <shifter_operand> <shifter_operand> può essere: un valore immediato #<valore> un registro Rm un registro, dopo scorrimento specificato con: - un valore immediato Rm, <sop> #<shift_imm> - un registro Rm, <sop> Rs gli operatori <sop> disponibili sono: ASR, LSL, LSR, ROR, RRX 29
<shifter_operand>: indirizzamento immediato Il campo dell istruzione contiene il valore su cui operare sintassi: #<immediato> 30 esempio: add R3, R3, #1 @ R3 R3+1 12 bit a disposizione per l operando immediato, con la seguente struttura: 8 bit (bit c) definiscono un valore c (0 c 255); 4 bit (bit r) specificano una rotazione verso destra di 2r posizioni <shifter_operand>: indirizzamento immediato 31 28 24 21 19 16 15 12 11 8 7 0 cond 0 0 1 opcode S Rn Rd rotate immed_8 31 0x00 c 0xFF 0 r 15 0 2r 30 #<immediato>=c>> rot 2r r c immediato valido: #0x104 (c=0x41, r=15) immediato non valido: #0x102
<shifter_operand>: indirizzamento di registro 32 Il valore su cui operare è contenuto in un registro Rm Tale valore può essere shiftato di una quantità: specificata in modo immediato (0..31: 5 bit) specificata da un altro registro (Rs): Rm, LSR #shift_imm oppure Rm, LSR Rs Rm, ASR #shift_imm oppure Rm, ASR Rs Rm, LSL #shift_imm oppure Rm, LSL Rs Rm, ROR #shift_imm oppure Rm, ROR Rs Rm, RRX esempi: add R3, R1, R2, LSL #2 @ R3 R1+R2*4 add R3, R1, R2, ASR R5 @ R3 R1+R2/2 R5 <shifter_operand>: indirizzamento di registro 33 31 28 24 21 19 16 15 12 11 7 5 3 0 cond 0 0 0 opcode S Rn Rd shift_imm sop 0 Rm codifica di Rm, <sop> #shift_imm 31 28 24 21 19 16 15 12 11 7 5 3 0 cond 0 0 0 opcode S Rn Rd Rs 0 sop 1 Rm codifica di Rm, <sop> Rs <sop>: 00 LSL 01 LSR 10 ASR 11 ROR (RRX = ROR #0)
Modo 1: esempi mov R0, #0 @ R0 0 add R3, R3, #1 @ R3 R3+1 cmp R7, #1000 @ cc (R7 1000) bic R9, R8, #0xff00 @ R9 R8 and not 0xff00 mov R2, R0 @ R2 R0 add R4, R3, R2 @ R4 R3+R2 mov R2, R0, LSL #2 @ R2 R0*4 add R9, R5, R5, LSL #3 @ R9 R5+R5*8 = R5*9 sub R9, R5, R5, ASR #3 @ R9 R5 R5/8 rsb R9, R5, R5, ASR #3 @ R9 R5/8 R5 mov R5, R3, RRX @ R5 R3 ruotato esteso @ a destra di una posiz. mov R7, R4, ROR R3 @ R7 R4 ruotato a destra @ di R3 posizioni 34 Modo 2 (per Word o unsigned Byte) sintassi: LDR STR{B} Rd, <addressing_mode2> <addressing_mode2> è un indirizzamento di registro con un eventuale: offset immediato offset da registro offset da registro scalato pre-incremento immediato pre-incremento da registro pre-incremento da registro scalato post-incremento immediato post-incremento da registro post-incremento da registro scalato 35
Modo 2: nessun offset Corrisponde a quello che nel PD32 è l indirizzamento indiretto con registro. 36 Il valore dell operando è puntato da un registro Rn (cioè Rn contiene l indirizzo dell operando) sintassi: [Rn] esempio: ldr R1, [R0] @ R1 M 32 [R0] Modo 2: offset Offset immediato [Rn, #±<offset_12>] @ Rd M[Rn ± <offset_12>] 37 Offset da registro [Rn, ±Rm] @ Rd M[Rn ± Rm] Offset da registro scalato [Rn, ±Rm, <sop> #<shift_imm>] @ Rd M[Rn ± (Rm <sop> # <shift_imm>)]
Modo 2: pre-incremento Pre-incremento immediato [Rn, #±<offset_12>]! @ Rn Rn ± <offset_12> @ Rd M[Rn] Pre-incremento da registro [Rn, ±Rm]! @ Rn Rn ± Rm @ Rd M[Rn] Pre-incremento da registro scalato [Rn, ±Rm, <sop> #<shift_imm>]! @ Rn Rn ± (Rm <sop> # <shift_imm>) @ Rd M[Rn] 38 Modo 2: post-incremento Post-incremento immediato [Rn], #±<offset_12> @ Rd M[Rn] @ Rn Rn ± <offset_12> Post-incremento da registro [Rn], ±Rm @ Rd M[Rn] @ Rn Rn ± Rm Post-incremento da registro scalato [Rn], ±Rm, <sop> #<shift_imm> @ Rd M[Rn] @ Rn Rn ± (Rm <sop> # <shift_imm>) 39
Pre/post post-increm.. con registro scalato L offset contenuto nel registro Rm può essere shiftato di un valore immediato di 5 bit sintassi: Pre-incremento Post-incremento 40 [Rn, ±Rm, LSL #num]! [Rn, ±Rm, LSR #num]! [Rn, ±Rm, ASR #num]! [Rn, ±Rm, ROR #num]! [Rn, ±Rm, RRX]! esempio: ldr R1, [R0], -R2, ASR #2 [Rn], ±Rm, LSL #num [Rn], ±Rm, LSR #num [Rn], ±Rm, ASR #num [Rn], ±Rm, ROR #num [Rn], ±Rm, RRX @ R1 M 32 [R0]; R0 R0-(R2/4) Indirizzamento auto-relativo Si ottiene usando il registro R15 (PC) nell indirizzamento indiretto con registro: esempi: ldr R1, [R15, -#8] ldr PC, [PC, R0, LSL #2] @ R1 M 32 [R15-8] @ PC M 32 [PC+R0*4] 41 Il valore di R15 usato è PC_istruz.+8 o +12 a causa del prefetching Lo shift è specificato tramite un valore immediato: il valore di R15 usato è PC_istruz.+8 Lo shift è specificato tramite un registro: il valore di R15 usato è PC_istruz.+12
Modo 2: esempi ldr R2, [R0] ldr R1, [R0,#4] ldr R1, [R0], #8 @ R2 M 32 [R0] @ R1 M 32 [R0+4] @ R1 M 32 [R0] @ R0 R0+8 42 ldr PC, [PC, R0, LSL #2]@ PC M 32 [PC+R0*4] strb R7, [R9], #1 @ M 8 [R9] R7 B @ R9 R9+1 str R5, [R0,#4]! @ R0 R0+4 @ M 32 [R0] R5 Modo 3 (per HalfWord/signed Byte) sintassi: STR LDR[H] Rd, <addressing_mode3> LDR[SH SB] Rd, <addressing_mode3> <addressing_mode3> può essere: offset immediato offset da registro pre-incremento immediato pre-incremento da registro post-incremento immediato post-incremento da registro differenze rispetto al Modo 2: - non si possono scalare i registri - gli offset immediati sono a soli 8bit 43
Modo 2 e modo 3: tabella riassuntiva 44 W LDR Modo 2 STR Modo 2 SH Modo 3 - H Modo 3 Modo 3 SB Modo 3 - B Modo 2 Modo 2 NOTA BENE: non ha senso parlare di STORE per quantità con segno, perché non c è alcuna estensione del segno da effettuare Modo 4 (per load/store multiplo) - 1 sintassi: LDM STM <addressing_mode4> Rn{!}, <registers> <addressing_mode4> può essere: IA increment after start_addr = Rn ; end_addr = Rn + #regs*4-4 IB increment before start_addr = Rn + 4 ; end_addr = Rn + #regs*4 DA decrement after start_addr = Rn - #regs*4 + 4 ; end_addr = Rn DB decrement before start_addr = Rn - #regs*4 ; end_addr = Rn 4 (#regs è il numero di registri indicati in <registers>) 45! provoca l'aggiornamento del registro Rn: al suo contenuto viene sommata o sottratta la quantità #regs*4
Modo 4 (per load/store multiplo) - 2 sintassi: LDM STM <addressing_mode4> Rn{!}, <registers> <registers> è la lista di registri da salvare/caricare, racchiusa tra parentesi graffe {} e con gli elementi separati da virgola. esempi: STMDB SP!, {R0-R7} @ salva sullo stack i registri @ da R0 a R7 LDMIA SP!, {R0-R7} @ ricarica R0-R7 salvati @ dall istruzione precedente LDMDA R9, {R1,R3-R5} @ carica i registri R1, R3-R5 @ da M 32 [R9-12].. M 32 [R9] Fine 03.a Introduzione ad ARM e al processore S3C2440