Datum:
Hallo Forum, nach 3 Stunden suchen frag ich jetzt mal in die Runde. Ich habe eine 10kB Binärdatei, die ich zusammen mit meinem dem restlichen Code ins Flash meines mega324P legen und über die Program Space Utilities (pgmspace.h) stückweise laden will. Das ganze ist ein Array von Datensätzen um meine AVR-Klapparatur zu parametrieren. Im ersten Schritt habe ich mir aus meiner 10k großen Datei ein Objekt generiert:
avr-objcopy -I binary -O elf32-avr -B avr:5 cmdtable.bin cmdtable.o |
Leider landet das Ganze erst mal im .data Segment:
avr-objdump -h cmdtable.o
cmdtable.o: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00002710 00000000 00000000 00000034 2**0
CONTENTS, ALLOC, LOAD, DATA
|
Also nochmal mit --rename-section:
avr-objcopy -I binary --rename-section .data=.progmem.data,contents,alloc,load,readonly,data -O elf32-avr -B avr:5 cmdtable.bin cmdtable.o
avr-objdump -h cmdtable.o
cmdtable.o: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .progmem.data 00002710 00000000 00000000 00000034 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
|
Ich bin mir nicht sicher, ob das so richtig ist. Auf alle Fälle landet das Objekt jetzt im Flash (Ausschnitt aus der .map des gesamt Images):
*(.progmem*)
.progmem.data 0x000000fa 0x2710 /home/max/work/NeonFlex/bintest/cmdtable.o
0x000000fa _binary_cmdtable_bin_start
0x0000280a _binary_cmdtable_bin_end
.progmem.data 0x0000280a 0xc /usr/lib/gcc/avr/4.3.4/../../../avr/lib/avr5/libc.a(vfscanf_std.o)
|
Mein Problem ist, daß ich beim Zugriff auf _binary_cmdtable_bin_start im Nirvana lande. Hier lasse ich mir die Adresse ausgeben:
extern PGM_VOID_P const _binary_cmdtable_bin_start;
extern PGM_VOID_P const _binary_cmdtable_bin_end;
...
debug("bin:0x%05x-0x%05x\n",
_binary_cmdtable_bin_start,
_binary_cmdtable_bin_end);
|
Und die Ausgabe: *flash_load_list - bin:0x00404-0x00504 Irgendwas läuft beim Linken oder bei Zugriff schief, ich komme aber nicht drauf. Ich kenne mich mit den binutils und dem linken leider noch zu wenig aus. Vielen Dank für eure Kommentare, Anmerkungen, Tipps. L.
Datum:
Was du da ausgibst ist nicht die Adresse deiner Daten, sondern es sind die ersten beiden Bytes der Daten (oder wären es, wenn vom Flash gelesen). Zugriff auf die Daten:
extern uint8_t _binary_cmdtable_bin_start[]; ... pgm_read_byte(&_binary_cmdtable_bin_start[42]); |
Datum:
Ist es nicht so, daß _binary_cmdtable_bin_start ein Zeiger auf das erste Element ist, allerdings im Addressraum des Flashes? Wenn ich über ... pgm_read_byte(&_binary_cmdtable_bin_start[42]); den Inhalt ausgeben lasse bekommen ich nur 0xff zurück. Ich denke nicht, daß _binary_cmdtable_bin_start den richtigen Wert hat.
Datum:
Anmerkung:
Wenn ich die Adresse aus der .map Datei verwende
0x000000fa _binary_cmdtable_bin_start
und dann folgendermaße auslese
temp[i] = pgm_read_byte( 0xfa + i);
dann lese ich die richtigen Werte. Meine Vermutung mit dem Wert in
_binary_cmdtable_bin_start scheint zu stimmen.
Ich mache einen Fehler beim "avr-objcopy" glaube ich. Any ideas?
Datum:
Maximilian K. schrieb: > Ist es nicht so, daß _binary_cmdtable_bin_start ein Zeiger auf das erste > Element ist, allerdings im Addressraum des Flashes? Nein, es ist ein Symbol, kein Zeiger. > Wenn ich über ... pgm_read_byte(&_binary_cmdtable_bin_start[42]); > den Inhalt ausgeben lasse bekommen ich nur 0xff zurück. Mit welcher Deklaration von _binary_cmdtable_bin_start?
Datum:
Stefan Ernst schrieb: > Maximilian K. schrieb: >> Ist es nicht so, daß _binary_cmdtable_bin_start ein Zeiger auf das erste >> Element ist, allerdings im Addressraum des Flashes? > > Nein, es ist ein Symbol, kein Zeiger. Beim Linken wird für _binary_cmdtable_bin_start eine Flashadresse eingetragen, deshalb verwendet man _binary_cmdtable_bin_start bei pgm_read_byte(&_binary_cmdtable_bin_start[]) wie einen Zeiger. Ich kann referenzieren und dereferenzieren. > >> Wenn ich über ... pgm_read_byte(&_binary_cmdtable_bin_start[42]); >> den Inhalt ausgeben lasse bekommen ich nur 0xff zurück. > > Mit welcher Deklaration von _binary_cmdtable_bin_start? Die Deklaration war extern unsigned char _binary_cmdtable_bin_start[];