Forum: Mikrocontroller und Digitale Elektronik Hexfile mit make manipulieren


von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Moinsen,
hab zu dem Thema nichts weiter gefunden.
Nachdem ich per Winavr das Programm für den AVR compiliert habe, soll 
der Compiler noch eine Zeile anhängen mit zB !FWT-0.4b-1.0.

Meine Projekte mit USB bekommen nen Bootloader zum gemütlichn 
Firmwareupdate. Damit man jetzt nicht ausversehen die falsche hex 
draufschiebt, sucht das PC Programm erst nach dieser Zeile um zu prüfen 
ob Hardwareversion und Projekt Übereinstimmen.

Daher suche ich nach ner möglichkeit, dass der Compiler das am Ende noch 
in die Hexdatei schiebt, gibts da irgendwelche Anweisungen für das 
makefile oder sonstewo?
Natürlich kann ichs auch immer manuell einfügen, aber irgendwann 
vergisst mans mal und Firmwareupdaten geht nicht beim Bekannten, der das 
Gerät nutzt.

BRäuchte das für dieses Gerät: http://www.fritzler-avr.de/HP/fwt.php

von Guter Rat (Gast)


Lesenswert?

Warum denn erst ins Hex-File einfügen??

Ich mache das so:
Eine Konstante (String) definieren und zwar im Source-Code selber.
Geht in C und ASM. Der Sourcecode wird geändert, dann kann ich auch
den String mit Datum, Versionsnummer etc noch verändern, dann
steht es auch dort wo es meiner Meinung nach hingehört.

Compilieren, linken etc. und schon steht der String auch im Hex-File.

Beim direkten Suchen im HEX_File ggf. darauf achten daß z.B. eine "0" 
aus
zwei Byte bestehen kann. nämich "3" und "0", weil 0x30 die 
Hex-Darstellung
ist.

von spess53 (Gast)


Lesenswert?

Hi

>Beim direkten Suchen im HEX_File ggf. darauf achten daß z.B. eine "0"
>aus
>zwei Byte bestehen kann. nämich "3" und "0", weil 0x30 die
>Hex-Darstellung ist.

????

0x30 ist der ASCII-Code für '0' und beansprucht nur 1 Byte.

MfG Spess

von Stefan E. (sternst)


Lesenswert?

1
echo "!FWT-0.4b-1.0" >> XXX.hex

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

@spess53
Eben doch ;)
In nem hexfile steht zB 0x30 als ASCI drinne, das belegt die ASCI chars 
3 und 0 , also 2 byte und geparsed ergeben die 2 bytes das byte 0x30 ;)

Das echo lässt sich ins makefile basteln?

Im Sourcecode stehen ja auch Firmwareversion und Hardwareversion, ist 
nur bissel anstrengend das rauszufiltern, man weis ja niw wos steht.

von spess53 (Gast)


Lesenswert?

Hi

>In nem hexfile steht zB 0x30 als ASCI drinne, das belegt die ASCI chars
>3 und 0 , also 2 byte und geparsed ergeben die 2 bytes das byte 0x30 ;)

Das Auseinanderdröseln brauchst du nur, wenn du ein Zeichen in 
Hexadezimal darstellen willst. Beim Parsen wird das Zeichen (1 Byte) 
komplett behandelt.

MfG Spess

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Nochmal:
Eine .hex Datei ist keine Binärdatei sondern eine Textdatei in der jeder 
Hexchar als ASCI steht.
http://de.wikipedia.org/wiki/Intel_HEX

von Stefan E. (sternst)


Lesenswert?

Martin Wende schrieb:
> Das echo lässt sich ins makefile basteln?

Generell ja, kommt aber darauf an, um was für ein Makefile es eigentlich 
geht. AVR-Studio dazu zu bringen, es in das automatisch generierte 
Makefile zu schreiben, dürfte z.B. kaum möglich sein.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ich nutze ja winavr und dort das Makefile ausm Tool mfile.
Ist also frei editierbar.

so eben mal gemacht:
1
 Create final output files (.hex, .eep) from ELF output file.
2
%.hex: %.elf
3
  @echo
4
  @echo $(MSG_FLASH) $@
5
  $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
6
  echo "!FWT-0.4b-1.0" >> $(TARGET).hex

dabei kommt raus:
1
blabla
2
:10318C000000000000000000000000000000000033
3
:10319C000000000000000000000000000000000023
4
:1031AC000000000000000000000000000000000013
5
:0831BC0000000000000000000B
6
:00000001FF
7
!FWT-0.4b-1.0

Vielen Dank!

bastel ich jetz nochn
1
echo $(FWVERS) >> $(TARGET).hex
draus und nehms als mein neues beispielmakefile ;)

von Stefan E. (sternst)


Lesenswert?

Ich an deiner Stelle würde das aber nicht dort "hart-codieren".

Schreibe weiter oben im Makefile so was:
1
HW_VERSION = 1.0
2
SW_VERSION = 0.4b
und dann
1
echo !FWT-$(SW_VERSION)-$(HW_VERSION) >> $@

Dann kannst du das auch gleich als Define in den Code weiterreichen, und 
musst es so nur an einer Stelle pflegen.

EDIT: Sehe gerade, du bist auch selber auf Ähnliches gekommen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Hab da jetz nur was gefunden wie man eine makefile Variable im C Code 
nutzen kann aber nicht andersrum.

http://stackoverflow.com/questions/7900661/how-to-read-a-cmake-variable-in-c-source-code
Das bespiel versteh ich jetzt auch grade nicht so wirklich.

Hat natürlich vorteile sich die Variablen gleich ausm C Code zu saugen, 
vor allem da dies schon im C Code vorkommt (wird aufm Display angezeigt)

von Stefan E. (sternst)


Lesenswert?

Martin Wende schrieb:
> Das bespiel versteh ich jetzt auch grade nicht so wirklich.
>
> Hat natürlich vorteile sich die Variablen gleich ausm C Code zu saugen,
> vor allem da dies schon im C Code vorkommt (wird aufm Display angezeigt)

Warum gehst du nicht einfach den umgekehrten (und viel einfacheren Weg) 
und übernimmst im C-Code die Angaben aus dem Makefile?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Das wär doch zu einfach ;)
Mach ich jetz auch so.

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.