[mauro@workstation apptest1]$ avr-objdump -h apptest1
apptest1: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 000000e6 00800100 00002868 0000291c 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 00002868 00000000 00000000 000000b4 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 00000099 008001e6 008001e6 00002a02 2**0
ALLOC
3 .eeprom 0000005d 00810000 00810000 00002a02 2**0
CONTENTS, ALLOC, LOAD, DATA
4 .stab 0000ac20 00000000 00000000 00002a60 2**2
CONTENTS, READONLY, DEBUGGING
5 .stabstr 000044b3 00000000 00000000 0000d680 2**0
CONTENTS, READONLY, DEBUGGING
6 .comment 00000021 00000000 00000000 00011b33 2**0
CONTENTS, READONLY
Quello che vedi è un disassemblato ridotto. Ho chiesto a avr-objdump di mostrarmi
l'header. La section 3 di nome .eeprom è quella che interessa a te.
Esattamente avrdude non è in grado di ricevere il file .elf, scrivere la flash e eeprom e
ci sono più motivo sul perché. Il formato di file .elf è specifico dei sistemi di derivazione unix, gcc è nato per questi sistemi, solo in seguito è stato portato sotto windows. La flessibilità di gcc ha fatto gola a molti e la natura open ha agevolato il proliferare di compilatori embedded tutti derivati da gcc. Gcc è solo un compilatore, non gli si può chiedere di fare ciò che non gli compete, per cui in nostro soccorso viene il progetto "binutils" che mastica file in formato .elf. Tramite un avrobjcopy possiamo eseguire delle operazioni sul file .elf, una di questa ci permette di estrarre la section .eeprom e conservarla in un file. La sintassi del comando non è molto documentata, (nei sorgenti di objdump di trova qualcosa).
Le operazione che ci servono sono le seguenti:
1 ) estrarre la section .eeprom dal file .elf per scriverla in un file
2 ) rimuovere la section .eeprom dal file .elf
3 ) Dal file .elf dovremmo anche eseguire uno strip dei simboli che non servono, genericamente
questa operazione è fatto su applicazioni che girano su pc, ma su avr il punto 4 chiarisce che
non è necessaria farla in fase separata.
4 ) Il file .elf deve essere convertito nel formato ihex (Intel Hex), oppure altro formato comprensibile
da avrdude, ad esempio 'bin' per binario, o srec, ecc. Questa fase esegue lo strip dei simboli
non necessari per l'esecuzione del programma.
avr-objcopy -O binary -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 apptest0 apptest0.eep.bin
Con il comando sopra ho estratto la section .eeprom dal file apptest0 (è in formato .elf) e l'ho scritta nel file apptest0.eep.bin.
A me serve il formato binario e non hex, per questo ho scritto -O binary e ho usato un nome di file che riflettesse dettaglio.
Per scrivere il file della eeprom basta usare avrdude, se hai difficoltà faccio compia e incolla
del comando che emette il mio tool.
avr-objcopy -R .eeprom -O ihex apptest0 apptest0.hex
Questo comando penso non ti serva in quanto arduino ide lo genera e lo fa proprio con questo
comando. Come puoi intuire "-R .eeprom", significa rimuovi section eeprom.
Le singole sezioni che vedi "stab, bss, tex" possono essere sottoposte allo stesso trattamento, inoltre nelle binutils ci sono utility per estrarre stringhe da section, o puoi semplicemente chiedere di mostrarti la lista dei simboli.
Ciao.