Forum: Compiler & IDEs Binärdatei als Objekt im Flash (progmem) - binutils


von Maximilian K. (laplace)


Lesenswert?

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:
1
avr-objcopy -I binary -O elf32-avr -B avr:5 cmdtable.bin cmdtable.o

Leider landet das Ganze erst mal im .data Segment:
1
avr-objdump -h cmdtable.o
2
3
cmdtable.o:     file format elf32-avr
4
5
Sections:
6
Idx Name          Size      VMA       LMA       File off  Algn
7
  0 .data         00002710  00000000  00000000  00000034  2**0
8
                  CONTENTS, ALLOC, LOAD, DATA

Also nochmal mit --rename-section:
1
avr-objcopy -I binary --rename-section .data=.progmem.data,contents,alloc,load,readonly,data -O elf32-avr -B avr:5 cmdtable.bin cmdtable.o
2
3
avr-objdump -h cmdtable.o
4
5
cmdtable.o:     file format elf32-avr
6
7
Sections:
8
Idx Name          Size      VMA       LMA       File off  Algn
9
  0 .progmem.data 00002710  00000000  00000000  00000034  2**0
10
                  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):
1
 *(.progmem*)
2
 .progmem.data  0x000000fa     0x2710 /home/max/work/NeonFlex/bintest/cmdtable.o
3
                0x000000fa                _binary_cmdtable_bin_start
4
                0x0000280a                _binary_cmdtable_bin_end
5
 .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:
1
extern PGM_VOID_P const _binary_cmdtable_bin_start;
2
extern PGM_VOID_P const _binary_cmdtable_bin_end;
3
...
4
  debug("bin:0x%05x-0x%05x\n",
5
      _binary_cmdtable_bin_start,
6
      _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.

von Stefan E. (sternst)


Lesenswert?

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:
1
extern uint8_t _binary_cmdtable_bin_start[];
2
3
... pgm_read_byte(&_binary_cmdtable_bin_start[42]);

von Maximilian K. (laplace)


Lesenswert?

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.

von Maximilian K. (laplace)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

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?

von Maximilian K. (laplace)


Lesenswert?

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[];

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.