Forum: Compiler & IDEs Binärdaten direkt in den Flash kopieren


von Jannis N. (vollmilch)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Jannis N. (vollmilch)


Lesenswert?

Das mit den Timings dürfte schwierig werden, da hast du recht. Ich werde 
es einfach mal mit 20 MHz Controllertakt ausprobieren, wenns nicht 
hinhaut, werde ich mir was einfallen lassen müssen. Ich will halt erst 
mal die Daten in den Flash bekommen um damit zu experimentieren.

von Jannis N. (vollmilch)


Angehängte Dateien:

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.