Forum: Mikrocontroller und Digitale Elektronik Firmwareinfo im Flash / hexfile


von Tobi (Gast)


Lesenswert?

Tach auch

ich programmiere auf einem ATmel controller und möchte an den Anfang des 
hex-files ein paar Infos in Form eines Strings schreiben. Zum Beispiel 
Infos zur aktuellen Firmware-Version oder Datum o.ä.
Leider jedoch ohne Erfolg.

Ich habe die Suche bemüht und benuitze vielleicht die falschen 
Suchwörter.

Habe folgendes gefunden (Stichwort: Segmente, Memorys, Section, etc):
In meinem C-Code schreibe ich folgendes:
1
const char FWnumber[] __attribute__ ((section (".FWversion"))) = "v0.1 dev";
In den Linker Einstellungen (Atmel Studio) Toolchain-->AVR/GNU 
Linker-->Miscellaneous:
1
-Wl,--section-start=.FWversion=0x800000

Wie gesagt, hatte ich damit keinen Erfolg. (Habe auch schon andere 
Adressen probiert)

Habt ihr einen Vorschlag für mich? Habe ich einen Fehler?

Gruß Tobi

von gvs (Gast)


Lesenswert?


von ?!? (Gast)


Lesenswert?

Tobi schrieb:
> Wie gesagt, hatte ich damit keinen Erfolg.

Wenn ich richtig informiert bin, ist ein .hex-File im Intel-Hex-Format. 
Und dort sind die Byte-Werte als ASCII (pro Byte 2 Zeichen) abgelegt. 
Das heißt du könntest sowieso nur die Ziffern 0..9 und die Buchstaben 
A..F verwenden. Alles andere ist nicht darstellbar.

Anders würde es aussehen, wenn du die gewünschten Informationen in einem 
binären File ablegen würdest, dort geht dann alles, dort sieht man alle 
Zeichenketten. Mußt nur mal eine *.exe mit einem Textbetrachter öffnen. 
Aber binäre Files sind m.M. relativ ungebräuchlich zum Programmieren von 
µC. Dort wird in der Regel mit hex oder elf gearbeitet...

von Georg G. (df2au)


Lesenswert?

Tobi schrieb:
> (Habe auch schon andere
> Adressen probiert)

Warum "probieren"? Wie groß ist dein Flash? Bestimmt nicht mehr als 
0x800000 Bytes. Also nimm die Größe, ziehe 16 ab (für deinen String) und 
nimm das als Adresse.

Es bleibt die Frage, warum du extra eine Section dafür aufmachen willst. 
Ich packe solche Infos ganz einfach ins Programm. Dann landen sie zwar 
nicht immer an der gleichen Stelle, aber das müssen sie ja wohl nicht.

von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

?!? schrieb:
> Wenn ich richtig informiert bin, ist ein .hex-File im Intel-Hex-Format.
> Und dort sind die Byte-Werte als ASCII (pro Byte 2 Zeichen) abgelegt.
> Das heißt du könntest sowieso nur die Ziffern 0..9 und die Buchstaben
> A..F verwenden. Alles andere ist nicht darstellbar.

Das hex-File muss man natürlich mit einem Hex Editor betrachten. (siehe 
Bild im Anhang).

Bisher habe ich diese Info separat im EEPROM abgelegt, daher stammt auch 
das Foto. Das ist natürlich umständlich. Praktischer ist es, wenn ich 
ein update der Firmware vornehme, dass diese Info auch in dem gleichen 
File vorhanden ist und ich nicht an einer anderen Stelle suchen muss.

Ich habe es auch schon einmal bei jemanden gesehen. Leider habe ich aber 
keinen Zugriff mehr auf diese Person.

Georg G. schrieb:
> Warum "probieren"? Wie groß ist dein Flash? Bestimmt nicht mehr als
> 0x800000 Bytes. Also nimm die Größe, ziehe 16 ab (für deinen String) und
> nimm das als Adresse.

Das habe ich ja gemacht, aber ich konnte meine Daten trotzdem nicht im 
hex-file finden. Falls es hilft: ich benutze den AT90CAN von Atmel.

von Georg G. (df2au)


Lesenswert?

Tobi schrieb:
> Das habe ich ja gemacht

Das von dir gezeigte Beispiel sagt mir aber, dass du weder die Größe 
auch nur annähernd kennst, noch, dass du 16 abgezogen hast.

Der AT90CAN128 hat 128MBytes Flash. Die letzte verfügbare Adresse ist 
also 0x1ffff. Dein Versionsstring sollte dann bei 0x1fff0 liegen. Nun 
musst du nur noch herausfinden, wie dein Entwicklungssystem rechnet. 
Atmel verwendet nämlich manchmal Byte Adressen und manchmal Wort 
Adressen. Also nimmst du für den ersten Schuss ein Miniprogramm "Hello 
World" und legst den String nach 0xfff8. Dann siehst du dir das Hex-File 
an. Liegt der String in der Mitte, rechnet deine Kiste in Bytes und du 
musst 0x1fff0 als Adresse nehmen.

von ?!? (Gast)


Lesenswert?

Tobi schrieb:
> Das hex-File muss man natürlich mit einem Hex Editor betrachten. (siehe
> Bild im Anhang).

Ich glaube, da liegt immer noch ein Mißverständnis vor. Ich hatte das 
gestern schon versucht zu erklären. Was du meinst, ist ein binäres File, 
welches so wie bei dir aussieht, wenn man es mit einem Hex-Editor 
öffnet.

Im Gegensatz dazu ist ein Hexfile (Endung *.hex) ein ganz normales 
ASCII-File, also ein Text-File, was zum Beispiel so aussieht 
(Ausschnitt):
1
:100000000C947E000C94A0000C94A0000C94A00012
2
:100010000C94A0000C94A0000C94A0000C94A000E0
3
:100020000C94A0000C94A0000C94A0000C94A000D0
4
:100030000C94A0000C94A0000C94A0000C942F1021
5
.....
6
:1044D000002863292030382F323031342000253233
7
:0E44E00058002534580025346400253364004C
8
:00000001FF
Aber du meinst offensichtlich kein Hex-File, sondern eben ein binäres 
File, richtig?

von Amateur (Gast)


Lesenswert?

Das Intel-Hex Format sieht keine Texte vor.

Speziell die Atmels haben am Programmanfang (0000++) einen reservierten 
Bereich (Sprungtabelle).

Willst Du also den Kreis quadrieren, wirst Du wohl einen Hammer oder 
eine Feile nehmen müssen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich mach sowas am Schluss der Firmware. Habe ich mir damals mal 
angewöhnt, um einen Page-Bug im alten a51 zu umgehen:
1
; in ASM
2
  .dw  0xd282      ; bandwidth and dr
3
  .dw  0xc039      ; power manager
4
  .db  "Ende der Fahnenstange matzetronics 2008 0.1.2"
5
// in C
6
const PROGMEM char VersionandCopyright[36] = "1.1 (c)2009-2013 matzetronics";
7
const PROGMEM char EndofFile[22] = "Ende der Fahnenstange ";

'Ende der Fahnenstange' ist soweit ich weiss, von Erich Kästner :-)

von Tobi (Gast)


Lesenswert?

Jetzt bin ich verunsichert!?!

Am besten schreibe ich was ich möchte. Ich glaube jetzt habe ich ein 
generelles Verständnisproblem.

- Ich schreibe ein Programm mit C-Code.
- Ich kompiliere das File und erhalte ein *.hex - file
- Dieses öffne ich mit einem hex-Editor (siehe Bild weiter oben)
- in der linken tabelle stehen die hex-daten in der rechten Tabelle sehe 
ich die entsprechenden Ascii Daten ("0x65" = "e")
- ich hatte jetzt erwartet, dass ich mein erzeugtes hex-file öffne und 
in der Ascii Tabelle meine Firmwareversion im Klartext lesen kann (so 
wie es im Bild aus dem EEPROM hexfile hervorgeht)

Geht das ?
Wenn ja wie?
Durch Eure Antworten, weiß ich im Moment gar nicht mehr was los ist :(
- Ich bin verwirrt -

von bal (Gast)


Lesenswert?

Tobi schrieb:
> - Ich kompiliere das File und erhalte ein *.hex - file
> - Dieses öffne ich mit einem hex-Editor (siehe Bild weiter oben)

Hier liegt schon mal ein Verständnisproblem vor.
*.hex Files sind gewöhnlich vom Format "Intel Hex".
Dieses Format ist kein Binärformat sondern reiner ASCII-Text. Somit 
brauchst du zum öffnen keinen hex-Editor sondern einen stinknormalen 
Editor (Notepad).

Ich schlage vor du liest dich erstmal hierrüber ein.

von Tobi (Gast)


Lesenswert?

bal schrieb:
> Ich schlage vor du liest dich erstmal hierrüber ein.

Das glaube ich auch.
Hast du einen Link oder ein Schlagwort wonach ich suchen soll?

von Tobi (Gast)


Lesenswert?

Aber wie komme ich jetzt an die Textinfos, die ich haben möchte? Welchen 
Viewer oder welches Programm benötige ich nun?

von Mike (Gast)


Lesenswert?

Tobi schrieb:
> Hast du einen Link oder ein Schlagwort wonach ich suchen soll?

bal schrieb:
> ... Format "Intel Hex".

von Peter D. (peda)


Lesenswert?

Ich schreibe mir ein _version.c:
1
#include <avr/pgmspace.h>
2
3
prog_uint8_t Version[] __attribute__((used));
4
prog_uint8_t Version[] = PROJECT_STRING ", "
5
                         "V:" REVISION_STRING ", "
6
                         __DATE__ "\n";

Durch den _ wird es als erstes hinter der Vektortabelle gelinkt.
Die Defines schreibe ich ins Make (oder Batch).

von bal (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ich schreibe mir ein _version.c:#include <avr/pgmspace.h>
>
> prog_uint8_t Version[] __attribute__((used));
> prog_uint8_t Version[] = PROJECT_STRING ", "
>                          "V:" REVISION_STRING ", "
>                          _DATE_ "\n";
>
> Durch den _ wird es als erstes hinter der Vektortabelle gelinkt.
> Die Defines schreibe ich ins Make (oder Batch).

Aber auch bei dieser Lösung gilt: deinen Text wirst du nicht im .hex 
File finden. Völlig egal ob du es mit einem Editor öffnest (dafür ist es 
gedacht) oder mit einem Hex-Editor.
Im .hex findest du niemals deinen Text in Klarschrift.

Die Dannegger Lösung funktioniert, wenn du die .elf im Hexeditor 
öffnest. Dann muss irgendwo dein Text zu finden sein.

von Erich (Gast)


Lesenswert?

Georg G. schrieb:
> Der AT90CAN128 hat 128MBytes Flash.

Genial!
Wo kann ich den kaufen?

Gruss

von Georg G. (df2au)


Lesenswert?

Erich schrieb:
> Genial!

Wer Schreibfehler findet, darf sie behalten.

von Erich (Gast)


Lesenswert?

Wo ist ein Schreibfehler?
Ist eine Verwechslung von 10 Millionen Euro und 10 Milliarden Euro nicht 
jeden zweiten Tag in den Medien?
Die Journalisten reden sich dann auch immer auf "Druckfehler" heraus.
Im technischen Bereich sind es dann k/M oder p/n Vorsilben die gerne 
verbuchselt werden.
Mit megamäßigen Grüßen

von Erich (Gast)


Lesenswert?

Zum Thema:
Mit dem Tool SRecord kann man nachträglich an beliebigen Adressen eines 
.HEX files was reinschreiben.
Die Syntax ist jedoch etwas kryptisch und für die TE hier wohl eher 
nicht förderlich.
Nur der Vollständigkeithalber nachgetragen.
http://srecord.sourceforge.net/
Gruss

von ?!? (Gast)


Lesenswert?

Erich schrieb:
> Zum Thema:
> Mit dem Tool SRecord kann man nachträglich an beliebigen Adressen eines
> .HEX files was reinschreiben.
> Die Syntax ist jedoch etwas kryptisch und für die TE hier wohl eher
> nicht förderlich.
> Nur der Vollständigkeithalber nachgetragen.
> http://srecord.sourceforge.net/
> Gruss

Das Tool kann zwar hex-Files lesen, aber es schreibt keine Infos direkt 
ins File. Es dekodiert das hex-File, schreibt in das dekodierte 
Binärfile und kodiert das dann wieder zum Hex-File. Deswegen kannst du 
auch damit keine Zeichenkette im hex-File lesen. Wenn andere 
ASCII-Zeichen als 0..9 und A..F im hex-File stehen, ist es kaputt. Gut, 
am Zeilenanfang steht noch ein ":".

von Phantomix X. (phantomix)


Lesenswert?

?!? schrieb:
> Wenn andere
> ASCII-Zeichen als 0..9 und A..F im hex-File stehen, ist es kaputt. Gut,
> am Zeilenanfang steht noch ein ":".

Ich biete noch '\r' und '\n' ;-)

Vielleicht wäre das Tool etwas für den TO
http://firmwarebatchtools.ugfx.org/

Du kannst damit bspw. die .hex einlesen und, sollte deine 
Firmwareversion an einer bestimmten Adresse stehen, diese extrahieren 
und anzeigen lassen.
Task 1: Load file from disk
Task 2: Read variable from RAM
Zum Schluss am besten bei "Project settings" deine Variable bei "Display 
success text" mit eintragen (siehe Screenshot 
http://firmwarebatchtools.ugfx.org/wp-content/uploads/2014/05/settings_project.png 
)

von Amateur (Gast)


Lesenswert?

Natürlich gibt es Hex-Viewer, die Dir am rechten Rand versuchen Text 
anzuzeigen.

Das ändert aber nichts daran, dass bei Atmel's, am Programmanfang, nur 
Sprungbefehle (Interrupttabelle) stehen.

Diese als Text zu interpretieren, ist bestenfalls lustig.

von ?!? (Gast)


Lesenswert?

Amateur schrieb:
> Natürlich gibt es Hex-Viewer, die Dir am rechten Rand versuchen Text
> anzuzeigen.

Aber nicht, wenn du ein *.hex-File damit geöffnet hast.
http://de.wikipedia.org/wiki/Intel_HEX#Beispiel

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

?!? schrieb:
> Und dort sind die Byte-Werte als ASCII (pro Byte 2 Zeichen) abgelegt.
> Das heißt du könntest sowieso nur die Ziffern 0..9 und die Buchstaben
> A..F verwenden. Alles andere ist nicht darstellbar.

Klar.  Und ein Computer kennt nur 0 und 1, alles andere ist nicht 
darstellbar.

von Amateur (Gast)


Angehängte Dateien:

Lesenswert?

@!?!
>Aber nicht, wenn du ein *.hex-File damit geöffnet hast.

Bist Du Dir sicher?

von ?!? (Gast)


Lesenswert?

Johann L. schrieb:
> Klar.  Und ein Computer kennt nur 0 und 1, alles andere ist nicht
> darstellbar.

Es geht hier um die ASCII-Darstellung innerhalb eine *.hex-Files. Und da 
gibt es per Definition nun mal keine anderen Zeichen als die oben 
erwähnten. Anders in einem Binärfile, dort kann jedes Zeichen von 
0..0xFF enthalten sein.

von Peter X. (peter_x)


Lesenswert?

In EPROMS wurden die Firmware-relevanten Informationen immer am Ende des 
HEX-Files sichtbar.
Das wurde früher (tm) mit dem DOS-Befehl copy hex1 + hex2 hex3 erledigt.
Damit wuchs das Hexfile um die Bytes in hex2. Die wurden mitgebrannt und 
enthielten deine Textstrings. K.A., wie das heute gemacht wird.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Peter Xuang schrieb:
> Damit wuchs das Hexfile um die Bytes in hex2. Die wurden mitgebrannt und
> enthielten deine Textstrings. K.A., wie das heute gemacht wird.

In HEX Files steht die Adresse, an der die Payload geschrieben werden 
soll, als 2tes Argument pro Zeile. Da kann man nicht einfach mit copy 
was zusammenbasteln, wenn sich hex1 mal in der Länge der Firmware 
ändert. hex2 könnte höchstens fest kodiert aufs Ende des 
Programmspeichers sein, dann klappt das. Das wiederum ist 
Prozessor-abhängig. x86 z.B. hat da oben den Reset Vektor.

Siehe 'Load Offset' :
https://de.wikipedia.org/wiki/Intel_HEX#Aufbau_eines_Datensatzes

von ?!? (Gast)


Lesenswert?

Matthias Sch. schrieb:
> Peter Xuang schrieb:
>> Damit wuchs das Hexfile um die Bytes in hex2. Die wurden mitgebrannt und
>> enthielten deine Textstrings. K.A., wie das heute gemacht wird.
>
> In HEX Files steht die Adresse, an der die Payload geschrieben werden
> soll, als 2tes Argument pro Zeile. Da kann man nicht einfach mit copy
> was zusammenbasteln, wenn sich hex1 mal in der Länge der Firmware
> ändert. hex2 könnte höchstens fest kodiert aufs Ende des
> Programmspeichers sein, dann klappt das. Das wiederum ist
> Prozessor-abhängig. x86 z.B. hat da oben den Reset Vektor.
>
> Siehe 'Load Offset' :
> https://de.wikipedia.org/wiki/Intel_HEX#Aufbau_ein...

Ich hab's auch schon paarmal versucht zu erklären. Da kommen dann 
Argumente wie:

Johann L. schrieb:
> Klar.  Und ein Computer kennt nur 0 und 1, alles andere ist nicht
> darstellbar.

Klar, darstellen kann man alles mögliche. Aber man kann keinen String in 
ein Hex-File reinschreiben. Auch wenn man einen Editor benutzt, der 
vielleicht das Intel-Hex-Format vor dem Anzeigen dekodiert, kann man 
dort nichts einfach ändern. Dann stimmen die vom Linker generierten 
Adressen nicht mehr, die Segmentadressen verschieben sich und was weiß 
ich noch alles. Die einzige Möglichkeit wäre, wenn der Editor 
beispielsweise ein neues Segment erzeugt, wo der String untergebracht 
würde. Aber wenn man den Speicher des Zielobjektes nicht kennt (z.B. ein 
µC) dann kann das auch nach hinten losgehen. Das neue Segment muß ja 
dann auch adressiert werden. Und dann muß das ganze veränderte File 
wieder ins Intel-Hex-Format codiert werden.

Und wenn man das so macht, ist die Zeichenkette nicht im *.hex-File zu 
sehen, sondern nur im dekodierten Binärfile.

von Bernd K. (prof7bit)


Lesenswert?

Die unkomplizierteste Variante ist hierzu einfach den Dateinamen zu 
verwenden. Ich glaube dafür war der Dateiname ursprünglich auch mal 
vorgesehen.

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.