[EEPROM]Generare file eep

nid69ita:
Ok. Grazie. Sorry ancora... ma quel programma è per scrivere su file.
Scusate se rompo. Faccio nuovo, scrivo i valori che andranno in eeprom, poi salvo il file come .epp oppure si usa esporta ?

Mai usato quel programma, immagino che ti scrive un file .hex, probabilmente supporta vari formati, poi lo rinomini .epp e con avrdude scrivi sulla eeprom del micro.
L'ideale sarebbe avere un programma unico, mirato ad Arduino, che fa tutto lui senza dover stare ad usare software diversi e combattere con la riga di comando di avrdude, se poi questa cosa viene introdotta nel IDE, come è stato fatto in Avr Studio, sarebbe perfetto.
Personalmente se devo inizializzare la EEPROM di Arduino prima preparo il relativo file con Avr Studio, poi carico l'epp con avrdudess, facile da fare però è scomodo da usare quando ti serve riprogrammare la EEPROM ogni volta durante lo sviluppo/debug del codice.

speedyant:
anche pippo.txt.

E se lo voglio pamela_anderson.txt ? :grin:

astrobeed:
Mai usato quel programma, immagino che ti scrive un file .hex, probabilmente supporta vari formati, poi lo rinomini .epp e con avrdude scrivi sulla eeprom del micro

Esporta Intel Hex 16, 20 oppure 32 bit

astrobeed:
E se lo voglio pamela_anderson.txt ? :grin:

No, viene grosso il file, troppe "tette" :grin:

Con EEMEM, o altri sistemi, puoi solo verificare che una certa cella non sia ad un valore prestabilito e di conseguenza scrivere, a run time, sulla EEPROM l'inizializzazione.
Al successivo riavvio del micro la cella avrà il valore prestabilito e la EEPROM non viene reinizializzata.

Non conosco gli altri sistemi internamente come funzionano, in breve con EEMEM si crea una section nel file .elf che puoi estrarre e scrivere nel file .eep, la cosa funziona solo se non usi la garbge sections (--gc-sections), allora io non la uso la prima volta così mi genera il file, poi abilito la gc è la section .eeprom viene buttata.

La "pragma" usata altrove ha la stessa funzione di "attribute"

booh, gira e rigira mi sa che diciamo la stessa cosa, ma in modo differente.
Mi fai un esempio di uso pragma e il risultato in eeprom?

Io estraggo la section eeprom così:

avr-objcopy -O binary -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 apptest0 apptest0.eep.bin

Ciao.

Fosse introdotto nell IDE Arduino avrebbe gia piu senso. Speriamo esca un estensione di Atmel studio che permetta la manipolazione dei file eep senza troppe difficoltà.

MauroTec:
booh, gira e rigira mi sa che diciamo la stessa cosa, ma in modo differente.

Ti allego un esempio di codice per PIC serie 18 per l'init della EEPROM.

// preinit EEPROM 
#pragma romdata eedata_scn = 0xf00000
 rom char eedata_values[10] = {51,72,93,114,135,166,0x03,0x00,0x00,0x00};
#pragma romdata

In pratica viene generato un singolo file .hex che contiene sia il binario per la flash che quello per la EEPROM, cambiano solo gli address, in fase di programmazione vengono scritte tutte e due con una singola operazione.

Scusa Astro, ma in ambiente AVR non esistono i file elf che fanno proprio quel lavoro?

RobertoBochet:
Scusa Astro, ma in ambiente AVR non esistono i file elf che fanno proprio quel lavoro?

Ancora continuate a non capire, avrgcc non permette di fare quello che faccio con i compilatori Microchip, nel codice sorgente introduco le pragma che ho indicato sopra con dentro i dati da mettere sulla EEPROM, viene generato un unico hex, che è quello che serve non l'elf che si usa per il debug, contenente sia la parte flash che quella EEPROM, clicco su upload e dopo pochi secondi il micro contiene sia il programma che i dati EEPROM, il tutto con una sola operazione.
In alternativa prendo il file .hex generato e lo carico sul micro tramite un qualunque programmatore per PIC, col suo software standalone, e ottengo lo stesso risultato.
Con gli AVR non mi risulta che sia possibile nemmeno da Avr Studio, almeno con la versione 4 che è quella che uso io, se poi le cose sono cambiate con la versione 6 e 7 tanto meglio, in tutti i casi da IDE di Arduino, al momento, la cosa rimane impossibile che poi è quello che interessa :slight_smile:

astrobeed:
Con gli AVR non mi risulta che sia possibile nemmeno da Avr Studio, almeno con la versione 4 che è quella che uso io, se poi le cose sono cambiate con la versione 6 e 7 tanto meglio,

Questo ? http://www.atmel.com/webdoc/atmelstudio/atmelstudio.Projects.GccWithOtherMemoryTypes.html

const char eeprdata[] __attribute__ ((section (".eeprom"))) = "Hello EEPROM";

nid69ita:
Questo ? http://www.atmel.com/webdoc/atmelstudio/atmelstudio.Projects.GccWithOtherMemoryTypes.html

Si ma poi che te ne fai del file .elf visto che lo usi solo con Avr Studio ?
Non ultimo il fatto che i file .elf sebbene hanno una struttura quasi standard poi il contenuto varia a seconda del produttore del IDE/compilatore, questo è il motivo principale per cui i produttori e i service accettano solo gli .hex per il servizio di programmazione dei micro.

In pratica viene generato un singolo file .hex che contiene sia il binario per la flash che quello per la EEPROM, cambiano solo gli address, in fase di programmazione vengono scritte tutte e due con una singola operazione.

Certo ciò è comodo, un solo file .hex che poi in fase di trasferimento fa apparire il tutto come una singola operazione. Comunque ci sarà anche un modo per dire di non scrivere il contenuto della eeprom, sicuramente basta spuntare le giuste check-box nell GUI.

Ti do una brutta notizia, sono almeno più di 2 anni che estraggo la eeprom dal file .elf con quella riga di comando. :smiley:

Dopo quel comando, rimuovo la section eeprom dal file .elf e lo trasformo in .hex così:

avr-objcopy -R .eeprom -O ihex apptest0 apptest0.hex

Ma che sono pazzo ogni volta scrivere tutta la tiritera per compilare, infatti non lo sono, ci pensa per me qtcreator.

Ciao.

Sperimenterò, vedrò come effettivamente lavorare su quei file con Atmel studio 7 e se sia possibile compilare il tutto in un singolo file. Per il momento qui è nata l'idea per una nuova feature che non sarebbe male implementare nell'IDE di Arduino.

Edit:
Ho sperimentato un po' in realtà molto poco, posso però assicurare che con

const char eeprdata[] __attribute__ ((section(".eeprom")))

è possibile definire i valori presenti nel file eep, dopo di che basta caricarlo con il file hex. Sembra di capire che effettivamente il file eep venga incluso nel file elf, non ho però provato l'upload, o meglio ho provato mediante avrdudess che però non accetta di default file elf e infatti l'upload non ha funzionato per quanto riguarda l'EEPROM, dovrei provare direttamente da avrdude.

Io (con AVRstudio4) faccio come ho scritto nel messaggio3, clikko su START e fa tutto lui

[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.