Binärdatei als Objekt im Flash (progmem) - binutils

OP #2627575
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.
#2627646
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]);
OP #2627697
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.
OP #2627740
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?
#2627753
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?
OP #2627784
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[];

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.