03.e ARM920T SAMSUNG s3c2440 partendo da zero A. Barbalace, M. Comin, C. Fantozzi, G. Manduchi System on Chip Samsung s3c2440: : che cos è è? 1 Il chip SAMSUNG s3c2440 integra un elevato numero di periferiche nello stesso chip, da cui il nome System On Chip (SoC). Il sistema di sviluppo è costituito da due schede (PCB printed circuit board): una, più piccola, su cui è saldato il SoC Samsung ed una seconda, più grande, la Motherboard, su cui si trova la circuiteria necessaria alla connessione di tutte le periferiche.
Vista del sistema di sviluppo 2 Samsung s3c2440a SDRAM Flash Alimentatore 12V Pulsante RESET CODEC IIS amplificatore speaker Pulsanti connessi al port I/O USB host USB client Chip e connettore RS232 Controller e connettore Ethernet Led e switch Pulsanti OFF e ON Scrittura di un programma 3 Editing Assembl. Collegam. moduli Collaudo
Ambiente di sviluppo 4 Programma Text Editor Per la scrittura e la modifica del testo sorgente Programma Assemblatore Traduce il testo sorgente in modulo oggetto Programma Linker Costruisce il programma eseguibile Programma Debugger Esegue il programma sotto controllo del programmatore Assemblatore e linker 5
Il primo programma 6 Preparare l ambiente di lavoro su PC Scrivere il programma Compilare e linkare Accendere il sistema Caricare il programma Eseguire il programma Non funziona... Premere RESET! Compilare e linkare (1 di 2) Partiamo dal seguente programma in assembly: 7 1 /*add1.s**************************************************** 2 * somma di due numeri : * 3 * addendi immediati, risultato su registro * 4 ***********************************************************/ 5 6.text 7.global _start 8 _start: 9.global add1_func 10 add1_func: 11 mov r0, #10 @ carica il primo operando 12 mov r1, #15 @ carica il secondo operando 13 add r2, r1, r0 @ esegue la somma 14 add1_end: 15 b add1_end @ trappola 16 17.end 18 19 /**********************************************************/ 20 /* Suggerimento/variante: */ /* in esecuzione passo-passo cambiare il valore contenuto */ 22 /* nei registri r0, r1 prima di eseguire la somma */ 23 /**********************************************************/
Compilare e linkare (2 di 2) 1) Assemby del programma tramite il seguente comando: arm-elf-as --gdwarf-2 -o add1.o add1.s 8 --gdwarf-2: specifica che si vogliono includere, nel modulo oggetto, informazioni di debug -o <file>.o: specifica il file di output (in cui verrà prodotto il modulo oggetto); <file>.s: specifica il file di input (contenente il modulo sorgente da tradurre). 2) Creazione dell eseguibile (in formato ELF): arm-elf-ld -Ttext 0x30000000 -o add1 add1.o -Ttext 0x30000000 specifica l indirizzo di memoria a partire dal quale si vuole che venga caricato il segmento.text Avviare il sistema Samsung s3c2440 (1 di 2) 9 Prima di avviare il sistema di sviluppo e necessario: 1) controllare che l alimentatore sia collegato alla rete elettrica e alla scheda; 2) collegare la scheda al computer host tramite una connessione seriale; 3) aprire un terminale nel computer host.
Avviare il sistema Samsung s3c2440 (2 di 2) Si procede poi con i seguenti punti: 4) PRIMA - alimentare il sistema azionando l interruttore on, situato in basso a destra; 5) POI (prima che siano trascorsi 10 secondi, sennò sul sistema di sviluppo si avvia Linux) impartire, dal terminale, il comando di connessione alla scheda: sh connetti.sh che avvia il programma kgdb, che è la parte di debugger residente sul sistema di sviluppo, con cui colloquierà il debugger (insight) residente sul PC host; 6) l accensione, sui led della scheda, del valore 0xAAAA segnala che la connessione e l avvio del debugger sulla scheda sono avvenuti correttamente. 10 Caricare il programma (1 di 4) Il programma viene caricato ed eseguito sotto il controllo del debugger tramite il tool insight. 11 Il tool viene lanciato, sul PC host, dal comando: arm-elf-insight -nx Scegliere File->Open e selezionare il programma precedentemente prodotto in formato ELF (nel nostro caso, add1)
Caricare il programma (2 di 4) Occorre adesso richiedere al debugger di connettersi alla scheda (target) selezionando Run -> Connect to Target. Si imposta quindi la finestra Target Selection come da figura, eccetto il il campo Port, posto a /dev/ttys0 Si preme infine il pulsante Ok, e la connessione tra host e scheda viene instaurata 12 Caricare il programma (3 di 4) Una volta connesso, l interfaccia diventa vuota. Cio e dovuto al fatto che il processore Samsung sta eseguento il codice di UBOOT, e non ancora il programma add1. Quest ultimo deve essere infatti ancora caricato. Si puo tornare alla visualizzazione del programma selezionandolo dal menu a tendina in alto. 13
Caricare il programma (4 di 4) Ora il programma puo essere scaricato dall Host alla scheda target tramite il comando Run->Download. 14 A questo punto il codice e stato caricato nella memoria del Samsung, a partire dall indirizzo 0x30000000 ed e pronto per essere eseguito, con il comando Run. Eseguire il programma (1 di 2) Per quanto fatto nei passi precedenti, l esecuzione si è fermata alla prima riga di codice del nostro file. Si procede quindi con l esecuzione passo passo usando oppure a seconda che si vogliano eseguire le istruzioni passo passo o si voglia eseguire tutta la chiamata ad una subroutine. Si possono anche definire dei breakpoint, sui quali l esecuzione si sospenderà. 15
Eseguire il programma (2 di 2) E possibile visualizzare lo stato del processore Samsung tramite il comando View->Registers La finestra evidenziera il contenuto dei registri e le modifiche conseguenti alle esecuzione delle istruzioni. Sara altresi possibile, tra le altre cose, alterare il contenuto di questi registri. 16 File di listing Per produrlo (nel file add1.lst) aggiungere l opzione a > add1.lst nel comando arm-elf-as: arm-elf-as --gdwarf-2 -o add1.o add1.s a > add1.lst 17 1 /*add1.s**************************************************** 2 * somma di due numeri : * 3 * addendi immediati, risultato su registro * 4 ***********************************************************/ 5 6.text 7.global _start 8 _start: 9.global add1_func 10 add1_func: 11 0000 0A00A0E3 mov r0, #10 @ carica il primo operando 12 0004 0F10A0E3 mov r1, #15 @ carica il secondo operando 13 0008 002081E0 add r2, r1, r0 @ esegue la somma 14 add1_end: 15 000c 010000EA b add1_end @ trappola 16 17.end
Oltre ad assemblatore e linker (1 di 2) arm-elf-objdump D -S add1.o > add1.odump produce, in add1.odump, il disassemblato del modulo oggetto add1.o arm-elf-objdump D -S add1 > add1.edump produce, in add1.edump, il disassemblato del modulo eseguibile add1 arm-elf-nm -a -l add1 > add1.sym stampa, in add1.sym, la lista di tutti i simboli usati nel modulo eseguibile arm-elf-size add1 > add1.size stampa, in add1.size, la lunghezza delle varie sezioni 18 Oltre ad assemblatore e linker (2 di 2) Per tutti i comandi, maggiori informazioni sulle opzioni disponibili possono essere ottenute con man <nomecomando> 19
Esempio d uso d di arm-elf elf-objdump (1 di 2) 20 Disassemblato del modulo oggetto add1.o ottenuto con il comando arm-elf-objdump add1.o D add1.o: file format elf32-littlearm Disassembly of section.text: 00000000 <_start>: 0: e3a0000a mov r0, #10 ; 0xa 4: e3a0100f mov r1, #15 ; 0xf 8: e0812000 add r2, r1, r0 0000000c <add1_end>: c: ea000001 b c <add1_end>... Esempio d uso d di arm-elf elf-objdump (2 di 2) Disassemblato del modulo eseguibile add1 ottenuto con il comando arm-elf-objdump add1 D add1: file format elf32-littlearm Disassembly of section.text: 30000000 <_start>: 30000000: e3a0000a mov r0, #10 ; 0xa 30000004: e3a0100f mov r1, #15 ; 0xf 30000008: e0812000 add r2, r1, r0 3000000c <add1_end>: 3000000c: eafffffe b 3000000c <add1_end>...
Fine 03.e ARM920T SAMSUNG s3c2440 partendo da zero