Aus RN-Wissen.de
Version vom 27. August 2007, 02:05 Uhr von Linux 80 (Diskussion | Beiträge) (Neu)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche
Balkonkraftwerk Speicher und Wechselrichter Tests und Tutorials

Die sogenannte Hex-Datei (auch Intel-Hex-Format) wird üblicherweise beim compilieren eines Quellcodes (z.B. C oder Bascom Basic) für einen Mikrocontroller erzeugt.

In diesem Artikel soll Hauptsächlich auf die für die Mikrocontrollerprogrammierung (davon für AVR) wichtigen Infos eingegangen werden.


Was hat es damit auf sich ?

  • Wird von der Programmiersoftware verwendet zum übertragen des Codes in den Controller (flashen)
  • Hex steht als Abkürzung für Hexadezimal
  • In der Datei kommen nur druckbare (ASCII-)Zeichen vor (0-9, A-F), und könnte deshalb mit jedem Texteditor geöffnet und bearbeitet werden
  • In jeder Zeile ist eine Prüfsumme angefügt zum einfachen erkennen von Übertragungsfehlern


Historisches

Ein von Intel eingeführtes Dateiformat zum besseren verarbeiten binärer Daten. Ursprünglich, wegen der 16Bit-Adressangabe, bis max. 64KByte Daten ausgelegt. Erst später wurde durch hinzufügen weiterer Datensatz-Typen der Adressraum erweitert. Unter Anlehnung an die Struktur der Intel-CPUs wurden die zusätzlichen Datensatz-Typen aufgebaut (20-Bit- und 32-Bit-Adressierung).

Durch die Verwendung der hexadezimalen Schreibweise können binäre Daten auf Bildschirm und Drucker ausgegeben werden da nur lesbare Zeichen vorkommen, was bei Einführung dieses Formats (19xx, wenig bis garkeine el. Massenspeicher) noch von Bedeutung war.


Internes

Wer eine Hex-Datei schon einmal mit einem Texteditor geöffnet hat, sieht eine Zeile wie diese:

:1000B000526F626F7465726E65747A2E646520206B

Eine Zeile wird als Record (Datensatz) bezeichnet.

Jedes Byte wird in hexadezimaler Schreibweise dargestellt.

Bedeutung:

Start Anzahl Adresse Typ Daten Prüfsumme
: 10 00 B0 00 52 6F 62 6F 74 65 72 6E 65 74 7A 2E 64 65 20 20 6B

Start

Immer ein ":" (Doppelpunkt) am Zeilenanfang.

Anzahl

Gibt die Anzahl der effektiven Datenbytes an, kann von 0 - 255 (0x00 - 0xFF) Bytes enthalten

Adresse

Adresse im 16-Bit Format an der die folgenden Daten gespeichert werden sollen. Mit 16 Bit können max. 64KByte an Daten Adressiert werden. Wer einen Mega128 (oder größer) voll ausnutzt, wird auch weitere Datensatztypen als üblich in der Hex-Datei finden.

Datensatz-Typen

00 - Daten

Ein Auschnitt der Beispielzeile von oben:
:1000B00052....6B
Die Zeile enthalt 0x10 (dez 16) Bytes an Nutzdaten, diese sollen ab Adresse 0x00B0 (dez 176) gespeichert werden.

01 - letzte Zeile

Die letzte Zeile sieht so aus:
:00000001FF
Danach folgt entweder das Dateiende, oder die Übertragung wird abgeschlossen.

02 - erweiterte Segment-Adresse

Eine "erweiterte Segment-Adress"-Zeile kann so aussehen:
:020000021000EC
Sie wird benötigt, wenn die Daten den Adressraum von 64KByte überschreiten (Ab ATMega128).
Im Datenbereich wird der oberer Teil (Bits 4 - 19) einer 20-Bit-Adresse im 16-Bit-Format angegeben. Zu dieser muss dann die Offset-Adresse jeder Zeile hinzuaddiert werden, um die eigentliche Adresse zu erhalten.

03 - Start Segment-Adresse

Eine "Start Segment-Adress"-Zeile kann so aussehen:
:0400000320000000D9
Sie wird benötigt, wenn die Daten an einer Adresse abgelegt werden sollen, der außerhalb eines 64KByte-Adressraums liegt.
Im Datenbereich wird die Adresse im 2x16-Bit-Format (Segment und Adresse) angegeben. Ergibt eine 20-Bit Adresse. Ist für die Struktur der Intel-CPUs ausgelegt.

04 - erweiterte Linear-Adresse

Eine "erweiterte Linear-Adress"-Zeile kann so aussehen:
:020000043000CA
Im Datenbereich wird der obere Teil (Bits 16-31) einer 32-Bit-Adresse im 16-Bit-Format angegeben.

05 - Start Linear-Adresse

Eine "Start Linear-Adress"-Zeile kann so aussehen:
:0400000500100000E7
Im Datenbereich wird die Adresse im 32-Bit-Format angegeben.

Daten/Info

Die eigentlichen Daten, bzw. Infos je nach Datensatztyp, max. 255 Byte pro Zeile

Prüfsumme

In die Prüfsumme fließen alle Bytes der Zeile ein, incl. der Anzahl, Adresse und Typ, aber nicht die Startmarkierung.

erzeugen

Zum erzeugen der Prüfsumme werden alle Bytes der Zeile als Zweier-Komplement summiert, sieht mit den Daten der Beispielzeile in verständlicher Schreibweise so aus:
0x00 - 0x10 - 0x00 - 0xB0 - 0x00 - 0x52 - 0x6F - 0x62 - 0x6F - 0x74 - 0x65 - 0x72 - 0x6E - 
 0x65 - 0x74 - 0x7A - 0x2E - 0x64 - 0x65 - 0x20 - 0x20 = 0xF96B
Da nur das Low-Byte als Prüfsumme angegeben wird (Modulo-256-Summe), wird der Wert 0x6B angehängt.

überprüfen

Zum überprüfen der Daten muss die Summe aller Bytes, incl. der Prüfsumme, das (Modulo-256)-Ergebnis 0x00 ergeben.
Die Beispielzeile wird so berechnet:
0x10 + 0x00 + 0xB0 + 0x00 + 0x52 + 0x6F + 0x62 + 0x6F + 0x74 + 0x65 + 0x72 + 0x6E + 
 0x65 + 0x74 + 0x7A + 0x2E + 0x64 + 0x65 + 0x20 + 0x20 + 0x6B = 0x700
Da nur das Low-Byte überprüft wird (Modulo-256), dieses hier 0x00 ist, kann die Zeile als erfolgreich übertragen angesehen werden.


Anwendungen

Software zum Umgang mit Hex-Dateien:

avr-objcopy

Wer die Tools zur AVR-Programmierung installiert hat (unter Windose WinAVR), hat zugriff auf das Consolen-Tool avr-objcopy.

Damit ist es möglich diverse Dateiformat, u.a. Hex-Dateien, in andere Formate zu übertragen.

Mit der folgenden Anweisung wird die Datei "test.bin", welche im Format binary (-I) vorliegt, im Format ihex (-O) gespeichert, unter dem neuen Dateinamen "test.hex".

avr-objcopy -O ihex -I binary test.bin test.hex

In die andere Richtung geht das natürlich auch, (Hex-Datei in Binär-Datei übertragen):

avr-objcopy -I ihex -O binary test.hex test.bin


Beim Compilieren eines C-Quellcodes wird dieses Tool über das makefile aufgerufen, sodass die Hex-Datei bei "make all" automatisch erstellt wird.


Bascom-Programmer

Compiler/Output

Für das Bascom interne Programmiertool ist die Hex-Datei nicht zwingend notwendig, da dies mit der Binärdatei auskommt. Falls aber eine andere Anwendung dafür eingesetzt werden muss, gibt es in den Optionen (unter Compiler/Output) ein Auswahlfeld, das beim compilieren eine Hex-Datei erzeugen lässt (Standardmäßig schon ausgewählt).

Mit dem Bascom Programmiertool können vom AVR ausgelesene Daten als Binär- oder Hex-Datei gespeichert werden. (Das scheint aber z.Zt. einen kleinen Bug zu haben, denn ab 64KByte stimmt die Adresse nicht mehr :-)


Siehe auch


Quellen


LiFePO4 Speicher Test