www.mikrocontroller.net

Binäre Daten zum Programm hinzufügen

Will man beliebige Daten einem Programm hinzufügen (z.B. Bitmaps, Fonts, Seriennummern, ...) gibt es dafür mehrere Möglichkeiten.

[Bearbeiten] Einfügen als C-Array

Die Daten werden mit einem Hilfsprogramm in ein C-Array umgewandelt und dann einfach einkompiliert. Zum Umwandeln von Binärdaten in ein C-Array gibt es bereits einige fertige Lösungen. So kann z.B. der kostenlose Hexeditor HxD eine Datei als C-Array exportieren. Mit Hilfe des Kommandozeilentools srec_cat ist dies ebenfalls möglich.

$ srec_cat my_data.bin -binary -output my_c_file.c -c-Array my_var_name -include

Es wird dann eine C-Datei erzeugt die ein Array my_var_name und einige Hilfsvariablen dazu enthält. Diese Datei wird dann einfach ins Projekt eingebunden und ganz normal verwendet.

Beim avr-gcc ist noch darauf zu achten das die Daten, falls gewünscht, im Programmspeicher und nicht im SRAM landen. Siehe AVR-GCC Tutorial

  • Vorteile
    • Einfach zu verwenden
    • Portabel
    • Typsicher
  • Nachteile
    • Zusätzliche Dateien (c/h) nötig
    • c Datei bei großen Binärdateien sehr groß
    • Ein zusätzlicher Schritt beim Bauen nötig
    • Daten müssen zum Zeitpunkt des Kompilierens bekannt sein

[Bearbeiten] objcopy

Mit objcopy wird aus der Binärdatei eine Objektdatei erstellt die zum Projekt gelinkt werden kann. Hier ein Beispiel wie das für den AVR gemacht wird.

$ avr-objcopy -I binary ~/my_data.bin --binary-architecture avr4 -O elf32-avr my_data.o
$ avr-nm -t my_data.o 
000008c6 D _binary__home_mat_my_data_bin_end
000008c6 A _binary__home_mat_my_data_bin_size
00000000 D _binary__home_mat_my_data_bin_start

Die Objektdatei enthält dann drei Symbole deren Namen allerdings etwas unhandlich sind und, je nach Aufruf von objcopy auch noch den kompletten Pfad der Binärdatei enthalten. Es ist allerdings möglich mit einem weiteren Aufruf von objcopy den Symbolen brauchbarere Namen zu verpassen. Dieses Datenpaket kann dann in C verwendet werden wenn man folgende Zeile einfügt:

extern unsigned char _binary__home_mat_my_data_bin_start[];

Beim Linken des Projekts wird die Objekdatei dann einfach mit zum Projekt gelinkt.

  • Vorteile
    • Keine zusätzliche Datei nötig
    • Keine manuell zu verwaltende Adresse
  • Nachteile
    • Nicht komplett portabel. Der Aufruf von objcopy ist je nach System immer etwas unterschiedlich.
    • Unhandliche Symbolnamen
    • Nicht Typsicher
    • Daten müssen zum Zeitpunkt des Linkens bekannt sein

[Bearbeiten] srec_cat

Wenn die Ausgabedatei des Compilers eine HEX-Datei ist (typisch bei µC Anwendungen) dann kann die Binärdatei mit Hilfe von srec_cat in die original Datei eingefügt werden. Bei dieser Methode kann dann allerdings nicht mehr über einen symbolischen Namen auf die Daten zugegriffen werden sondern es muss mit festen Adressen gearbeitet werden. Beispiel für eine Datei die in die finale Intel-HEX-Datei beim Offset 0xF000 eingefügt wird.

srec_cat myprog.hex -intel my_data.bin -binary -offset 0xF000 -output my_output.hex -intel -address-length=2

In C kann dann mittels eines Pointers bzw. beim AVR mitteles den PROGMEM Funktionen auf diese Daten zugegriffen werden.

uint8_t * my_data = (uint8_t *)0xF000;
  • Vorteile
    • Keine zusätzliche Datei nötig
    • Daten müssen zum Zeitpunkt des Linkens nicht bekannt sein (z.B. Seriennummer)
  • Nachteile
    • Fixe Adresse muss verwendet werden
    • Nicht Typsicher
webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net