Binärdaten direkt in den Flash kopieren

OP #2025537
Lesenswert?

Hallo miteinander,

ich habe vor mit einem Atmaga644 ein EPROM (27c256) zu emulieren um den 
Inhalt bequem per ISP verändern zu können. Die Rohdaten liegen mir binär 
als .bin-Datei vor. Nun muss ich die Daten aber irgendwie in den Flash 
des Controllers bekommen. Dazu hab ich mich auch mal informiert: 
Beitrag "Rohdaten direkt in Flash übertragen" , 
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_binarydata . 
Leider klappt das bei mir überhaupt nicht. Ich arbeite gerade mit dem 
AVR-Studio unter Windows und verwende ein externes Makefile, das ich mir 
mit MFile (WinAVR) zusammengeklickt habe. Darin muss man ja dann 
folgenden Abschnitt reinkopieren:

$(OBJDIR)/%.o : %.bin
        @echo Converting $<
        @$(OBJCOPY) -I binary -O elf32-avr \
        --rename-section 
.data=.progmem.data,contents,alloc,load,readonly,data \
        --redefine-sym _binary_$*_bin_start=$* \
        --redefine-sym _binary_$*_bin_end=$*_end \
        --redefine-sym _binary_$*_bin_size=$*_size_sym \
        $(<) $(@)
        @echo "extern const char" $(*)"[] PROGMEM;" > $(*).h
        @echo "extern const char" $(*)_end"[] PROGMEM;" >> $(*).h
        @echo "extern const char" $(*)_size_sym"[];" >> $(*).h
        @echo "#define $(*)_size ((int)$(*)_size_sym)" >> $(*).h

Das hab ich ganz unten, wo auch die C Files in o Files umgewandelt 
werden reinkopiert. Die rom.bin liegt in meinem Projektordner. Das 
funktioniert bei mir aber nicht. Die rom.bin wird nicht umgewandelt und 
mein Speicherverbrauch liegt auch nur bei ca. 150bytes. Wenn ich das 
ganze ein Stückchen höher ins Makefile kopiere und die % durch rom 
ersetze wird die Datei umgewandelt, aber der Compiler macht nicht mehr 
was er soll. Wäre nett wenn mir jemand grob beschreiben könnte was ich 
zu tun habe, ich bin langsam echt am verzweifeln.

Vielen Dank
Gruß Jannis
Persönliche Seite #2025544
Lesenswert?

Jannis N. schrieb:
> ich habe vor mit einem Atmaga644 ein EPROM (27c256) zu emulieren

Wie willst Du da vorgehen? Benutzt Du ein externes SRAM, das Du mit dem 
AVR befüllst, oder hast Du die Idee, das EPROM-Verhalten komplett in 
Software nachzuahmen? Letzeres dürfte eine ziemliche ... Herausforderung 
sein, sofern der Emulator halbwegs übliche Zugriffszeiten einhalten 
soll.
OP #2033088
Lesenswert?

Nach ewigem Rumprobieren ist es mir jetzt doch gelungen die Daten in den 
Flash zu bekommen. Für alle die auch damit Probleme haben sollten hab 
ich mal das Makefile angehängt.

Verändert oder ergänzt wurde:
BINF = rom.bin


# Define all object files.
OBJ = $(BINF:%.bin=$(OBJDIR)/%.o) $(SRC:%.c=$(OBJDIR)/%.o) 
$(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)

# Define all listing files.
LST = $(BINF:%.bin=$(OBJDIR)/%.lst) $(SRC:%.c=$(OBJDIR)/%.lst)


$(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
$(OBJDIR)/%.o : %.bin
  @echo Converting $<
  @$(OBJCOPY) -I binary -O elf32-avr \
  --rename-section .data=.progmem.data,contents,alloc,load,readonly,data 
\
  --redefine-sym _binary_$*_bin_start=$* \
  --redefine-sym _binary_$*_bin_end=$*_end \
  --redefine-sym _binary_$*_bin_size=$*_size_sym \
  $(<) $(@)
  @echo "extern const char" $(*)"[] PROGMEM;" > $(*).h
  @echo "extern const char" $(*)_end"[] PROGMEM;" >> $(*).h
  @echo "extern const char" $(*)_size_sym"[];" >> $(*).h
  @echo "#define $(*)_size ((int)$(*)_size_sym)" >> $(*).h
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren