Support für BiDiB

Erzeugen von Hex-Datei für Firmware-Update

Üblicherweise werden Projekte aus Quelldateien übersetzt, die übersetzten Dateien (sog. Object-Dateien) werden miteinander verbunden ('gelinkt') und daraus wird dann die Binärdatei für die Zielbaugruppe gewonnen. Die Darstellung der Daten erfolgt in BiDiB als Intel-Hex-Datei, dann kann diese Binärdatei einfach mit dem standardisiertem Firmware-Update-Verfahren in den Baustein eingespielt werden.

In der Regel erfolgt dieser Vorgang (oft auch 'Build' genannt) automatisiert mit Hilfe eines Programmes ('make'), welches die gegenseitigen Abhängigkeiten der Quelldateien prüft und alle notwendigen Aufrufe durchführt.

Der Ergebnis eines solchen Prozesses ist typischerweise eine Datei mit folgendem Namen: mein_projekt.hex.

Dateinamen für BiDiB

Dateinamen für BiDiB sollen wie folgt aufgebaut sein:

<project>_<version>.000.hex

wobei project für den Namen der Firmware steht und version den Änderungsindex angibt und i. d. R. aus drei Zahlen besteht. 000 bezeichnet dann den Zielspeicherbereich. D.h. man muss das normale Ergebnis des build-Vorganges passend umbenennen.

Automatisches Erzeugen mit make

Dieses Beispiel zeigt exemplarisch, wie man sich diese Dateinamenskonvention mit make generieren kann. Im Beispiel wird gawk und cp benutzt, welches bei den utils des gcc enthalten ist.

1. Anlegen einer Versionsdatei im Quellcode (version.h):

#define MAIN_VERSION                0
#define SUB_VERSION                 13
#define COMPILE_RUN                 01

Diese Datei wird vom Quellcode gelesen und die darin verwendeten defines werden für die Versionsabfrage in BiDiB verwendet.

2. Auslesen von version.h mit make:

Im makefile legt man sich eine Variable MYVERSION an, diese füllt man mittels eines Shell-Befehls aus der version.h. Hierzu durchsucht man mittels gawk diese Datei nach den Schlüsselwörtern und holt sich den dritten Parameter in der Zeile:


MYVERSION := $(shell gawk '/MAIN_VERSION/ {printf $$3 "."} /SUB_VERSION/ {printf $$3 "."} /COMPILE_RUN/ {printf $$3}' ../version.h )

Man beachte, dass man das $-Zeichen für Parameter zweimal schreiben muss, einmal fällt es bei der Substitution von make raus. MYVERSION enthält nun die Zeichenkette: 0.13.01

3. Erzeugen der Hexdatei:

Hier benutzt man die Variable und fügt im makefile einen Copy-Befehl hinzu, welcher die Ausgabedateien umkopiert:


%.hex: $(TARGET)
        avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@
        cp $(PROJECT).hex $(PROJECT)_$(MYVERSION).000.hex

%.eep: $(TARGET)
        -avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@ || exit 0
        cp $(PROJECT).eep $(PROJECT)_$(MYVERSION).001.hex

Und man erhält: mein_projekt_0.13.01.000.hex und mein_projekt_0.13.01.001.hex.