K (→00 - Daten: typo) |
Rgf (Diskussion | Beiträge) K |
||
(6 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | Die sogenannte Hex-Datei (auch Intel-Hex-Format) wird | + | Die sogenannte '''Hex-Datei''' (auch Intel-Hex-Format) wird von einigen [[Compiler]]n als Ausgabedatei erzeugt (z.B. [[Bascom|Bascom Basic]]). Die HEX-Datei enthält das compilierte Programm in binärer Form und wird verwendet, wenn es in den [[Mikrocontroller]] übertragen werden soll. |
− | In diesem Artikel soll | + | 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 ? === | + | === Was hat es damit auf sich? === |
− | * Wird von der Programmiersoftware verwendet zum | + | * Wird von der Programmiersoftware verwendet zum Übertragen des Codes in den Controller (flashen) |
* Hex steht als Abkürzung für Hexadezimal | * Hex steht als Abkürzung für Hexadezimal | ||
− | * In der Datei kommen nur | + | * In der Datei kommen nur die druckbaren (ASCII-)Zeichen 0-9, A-F, : und Leerzeichen vor und könnte deshalb mit jedem Texteditor geöffnet und bearbeitet werden |
− | * In jeder Zeile ist eine Prüfsumme angefügt zum einfachen | + | * In jeder Zeile ist eine Prüfsumme angefügt zum einfachen Erkennen von Übertragungsfehlern |
== Historisches == | == Historisches == | ||
− | Ein von Intel eingeführtes Dateiformat zum besseren | + | Ein von Intel eingeführtes Dateiformat zum besseren Verarbeiten binärer Daten. |
− | Ursprünglich | + | Ursprünglich war das Format wegen des 16Bit-Adressraumes bis max. 64 KByte Daten ausgelegt. Erst später wurde durch Hinzufügen weiterer ''[[#Datensatz-Typen|Datensatz-Typen]]'' der Adressraum erweitert. |
− | Unter Anlehnung an die Struktur der Intel-CPUs wurden die zusätzlichen Datensatz-Typen | + | Unter Anlehnung an die Struktur der Intel-CPUs wurden die zusätzlichen Datensatz-Typen für 20-Bit- und 32-Bit-Adressierung aufgebaut. |
− | + | Da nur lesbare Zeichen zur Darstellung verwendet werden, können binäre Daten auf Bildschirm und Drucker ausgegeben werden, was bei Einführung dieses Formats (19xx, wenig bis gar keine el. Massenspeicher) noch von Bedeutung war. | |
Zeile 44: | Zeile 44: | ||
=== Start === | === Start === | ||
− | + | Es steht immer ein ":" (Doppelpunkt) am Zeilenanfang. | |
=== Anzahl === | === Anzahl === | ||
Zeile 52: | Zeile 52: | ||
=== Adresse === | === 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 | + | 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 [[ATmega128]] (oder größer) voll ausnutzt, wird auch weitere Datensatztypen als üblich in der Hex-Datei finden. |
=== Datensatz-Typen === | === Datensatz-Typen === | ||
Zeile 75: | Zeile 75: | ||
:020000'''02'''1000EC | :020000'''02'''1000EC | ||
− | :Sie wird benötigt, wenn die Daten den Adressraum von 64KByte überschreiten ( | + | :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. | + | :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 ==== | ==== 03 - Start Segment-Adresse ==== | ||
Zeile 83: | Zeile 83: | ||
:040000'''03'''20000000D9 | :040000'''03'''20000000D9 | ||
− | :Sie wird benötigt, wenn die Daten an einer Adresse abgelegt werden sollen, | + | :Sie wird benötigt, wenn die Daten an einer Adresse abgelegt werden sollen, die außerhalb eines 64KByte-Adressraums liegt. |
− | :Im Datenbereich wird die Adresse im | + | :Im Datenbereich wird die Adresse im 2×16-Bit-Format (Segment und Adresse) angegeben. Ergibt eine 20-Bit Adresse. Ist für die Struktur der Intel-CPUs ausgelegt. |
==== 04 - erweiterte Linear-Adresse ==== | ==== 04 - erweiterte Linear-Adresse ==== | ||
Zeile 102: | Zeile 102: | ||
=== Daten/Info === | === Daten/Info === | ||
− | + | Die eigentlichen Daten, bzw. Infos je nach Datensatztyp, max. 255 Byte pro Zeile | |
=== Prüfsumme === | === Prüfsumme === | ||
Zeile 110: | Zeile 110: | ||
==== erzeugen ==== | ==== erzeugen ==== | ||
− | :Zum | + | :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 - | '''0x00''' - 0x10 - 0x00 - 0xB0 - 0x00 - 0x52 - 0x6F - 0x62 - 0x6F - 0x74 - 0x65 - 0x72 - 0x6E - | ||
0x65 - 0x74 - 0x7A - 0x2E - 0x64 - 0x65 - 0x20 - 0x20 = 0xF9'''6B''' | 0x65 - 0x74 - 0x7A - 0x2E - 0x64 - 0x65 - 0x20 - 0x20 = 0xF9'''6B''' | ||
− | :Da nur das Low-Byte als Prüfsumme angegeben wird (Modulo-256-Summe), wird der Wert 0x6B angehängt. | + | :Da nur das Low-Byte als Prüfsumme angegeben wird (Modulo-256-Summe), wird der Wert <tt>0x6B</tt> angehängt. |
==== überprüfen ==== | ==== überprüfen ==== | ||
− | :Zum | + | :Zum Überprüfen der Daten muss die Summe aller Bytes, incl. der Prüfsumme, das (Modulo-256)-Ergebnis <tt>0x00</tt> ergeben. |
:Die Beispielzeile wird so berechnet: | :Die Beispielzeile wird so berechnet: | ||
0x10 + 0x00 + 0xB0 + 0x00 + 0x52 + 0x6F + 0x62 + 0x6F + 0x74 + 0x65 + 0x72 + 0x6E + | 0x10 + 0x00 + 0xB0 + 0x00 + 0x52 + 0x6F + 0x62 + 0x6F + 0x74 + 0x65 + 0x72 + 0x6E + | ||
0x65 + 0x74 + 0x7A + 0x2E + 0x64 + 0x65 + 0x20 + 0x20 + 0x'''6B''' = 0x7'''00''' | 0x65 + 0x74 + 0x7A + 0x2E + 0x64 + 0x65 + 0x20 + 0x20 + 0x'''6B''' = 0x7'''00''' | ||
− | :Da nur das Low-Byte überprüft wird (Modulo-256), dieses hier 0x00 ist, kann die Zeile als erfolgreich übertragen angesehen werden. | + | :Da nur das Low-Byte überprüft wird (Modulo-256), dieses hier <tt>0x00</tt> ist, kann die Zeile als erfolgreich übertragen angesehen werden. |
Zeile 132: | Zeile 132: | ||
=== avr-objcopy === | === avr-objcopy === | ||
− | Wer die Tools zur AVR-Programmierung installiert hat (unter | + | Wer die Tools zur AVR-Programmierung installiert hat (unter Windows [[WinAVR]]), hat Zugriff auf das Consolen-Tool ''avr-objcopy''. |
− | Damit ist es möglich diverse | + | Damit ist es möglich, diverse Dateiformate, 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". | + | Mit der folgenden Anweisung wird die Datei "test.bin", welche im Format ''binary'' (<tt>-I</tt>) vorliegt, im Format ''ihex'' (<tt>-O</tt>) gespeichert, unter dem neuen Dateinamen "test.hex". |
avr-objcopy -O ihex -I binary test.bin test.hex | avr-objcopy -O ihex -I binary test.bin test.hex | ||
Zeile 144: | Zeile 144: | ||
avr-objcopy -I ihex -O binary test.hex test.bin | avr-objcopy -I ihex -O binary test.hex test.bin | ||
+ | Beim Compilieren eines C-Quellcodes wird dieses Tool üblicherweise über das [[Makefile]] aufgerufen, so dass die Hex-Datei bei "make all" automatisch erstellt wird. | ||
− | + | === BinHex === | |
+ | Unter den Tools von [[LunaAVR]] gibt es das Consolen-Tool ''binhex''. | ||
+ | |||
+ | Damit ist es möglich, Rohdaten in das Hex-Format zu wandeln. Optional können dabei auch bestimmte Speichergrenzen angegeben werden. Das Tool speichert auch Binärdaten korrekt die größer als 64k sind. | ||
+ | |||
+ | Mit der folgenden Anweisung wird die Datei "test.bin", welche im Format ''binary'' vorliegt, im Format ''ihex'' mit der Dateiendung ".hex" gespeichert (die Zieldatei ist automatisch der Originaldateiname mit Dateiendung ".hex", wenn keine extra Zieldatei angegeben wurde). Andere Dateinamen oder Dateipfade können mit der Option (<tt>-d</tt>) angegeben werden. | ||
+ | |||
+ | binhex -v test.bin | ||
=== Bascom-Programmer === | === Bascom-Programmer === | ||
[[Bild:BascomOptionsHexFile.jpg|thumb|Compiler/Output]] | [[Bild:BascomOptionsHexFile.jpg|thumb|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 | + | 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). Andersherum, lassen sich mit dem Bascom Programmiertool auch anders erstellte HEX-Dateien zum µC übertragen. |
Mit dem Bascom Programmiertool können vom AVR ausgelesene Daten als Binär- oder Hex-Datei gespeichert werden. <small>(Das scheint aber z.Zt. einen kleinen Bug zu haben, denn ab 64KByte stimmt die Adresse nicht mehr :-)</small> | Mit dem Bascom Programmiertool können vom AVR ausgelesene Daten als Binär- oder Hex-Datei gespeichert werden. <small>(Das scheint aber z.Zt. einen kleinen Bug zu haben, denn ab 64KByte stimmt die Adresse nicht mehr :-)</small> | ||
− | |||
== Siehe auch == | == Siehe auch == | ||
* [[Programmer]] | * [[Programmer]] | ||
− | * [[ | + | * [[HEX Beispiel-Dateien für AVR]] |
− | * [[ | + | * [[Bascom - Erstes Programm in den AVR Controller übertragen]] |
Zeile 167: | Zeile 174: | ||
* [http://www.google.de/search?hl=de&q=intelhex] u.a. :-) | * [http://www.google.de/search?hl=de&q=intelhex] u.a. :-) | ||
− | |||
− | |||
[[Kategorie:Grundlagen]] | [[Kategorie:Grundlagen]] | ||
− | |||
[[Kategorie:Microcontroller]] | [[Kategorie:Microcontroller]] | ||
− | |||
[[Kategorie:Praxis]] | [[Kategorie:Praxis]] |
Aktuelle Version vom 3. Dezember 2012, 12:44 Uhr
Die sogenannte Hex-Datei (auch Intel-Hex-Format) wird von einigen Compilern als Ausgabedatei erzeugt (z.B. Bascom Basic). Die HEX-Datei enthält das compilierte Programm in binärer Form und wird verwendet, wenn es in den Mikrocontroller übertragen werden soll.
In diesem Artikel soll hauptsächlich auf die für die Mikrocontrollerprogrammierung (davon für AVR) wichtigen Infos eingegangen werden.
Inhaltsverzeichnis
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 die druckbaren (ASCII-)Zeichen 0-9, A-F, : und Leerzeichen vor 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 war das Format wegen des 16Bit-Adressraumes bis max. 64 KByte 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 für 20-Bit- und 32-Bit-Adressierung aufgebaut.
Da nur lesbare Zeichen zur Darstellung verwendet werden, können binäre Daten auf Bildschirm und Drucker ausgegeben werden, was bei Einführung dieses Formats (19xx, wenig bis gar keine 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
Es steht 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 ATmega128 (oder größer) voll ausnutzt, wird auch weitere Datensatztypen als üblich in der Hex-Datei finden.
Datensatz-Typen
00 - Daten
- Ein Ausschnitt der Beispielzeile von oben:
:1000B00052....6B
- Die Zeile enthält 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, die außerhalb eines 64KByte-Adressraums liegt.
- Im Datenbereich wird die Adresse im 2×16-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 Windows WinAVR), hat Zugriff auf das Consolen-Tool avr-objcopy.
Damit ist es möglich, diverse Dateiformate, 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 üblicherweise über das Makefile aufgerufen, so dass die Hex-Datei bei "make all" automatisch erstellt wird.
BinHex
Unter den Tools von LunaAVR gibt es das Consolen-Tool binhex.
Damit ist es möglich, Rohdaten in das Hex-Format zu wandeln. Optional können dabei auch bestimmte Speichergrenzen angegeben werden. Das Tool speichert auch Binärdaten korrekt die größer als 64k sind.
Mit der folgenden Anweisung wird die Datei "test.bin", welche im Format binary vorliegt, im Format ihex mit der Dateiendung ".hex" gespeichert (die Zieldatei ist automatisch der Originaldateiname mit Dateiendung ".hex", wenn keine extra Zieldatei angegeben wurde). Andere Dateinamen oder Dateipfade können mit der Option (-d) angegeben werden.
binhex -v test.bin
Bascom-Programmer
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). Andersherum, lassen sich mit dem Bascom Programmiertool auch anders erstellte HEX-Dateien zum µC übertragen.
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
- [1] u.a. :-)