Intel HEX
Soubor typu Intel-Hex (tj. MCS-86 Object File Format) je textový soubor definující obsah paměti (např. RAM, ROM, FLASH, EEPROM) pro počítačové systémy. Jeden řádek reprezentuje jeden záznam, na konci řádku je jednobajtový kontrolní součet dovolující ověřit neporušenost dat. Velikost jednoho řádku obvykle nepřesahuje rozumnou míru, tj. např. 80 znaků. Intel HEX je pravděpodobně nejrozšířenějším datovým formátem pro programování jednoduchých vestavěných systémů.
Data v souborech Intel-Hex jsou kódována do ASCII pomocí hexadecimální soustavy, aby byla čitelná v běžném textovém editoru. Alternativními formáty pro definici obsahu paměti jsou například formáty Motorola S-record nebo TI-tagged.
Ukázka
Následující obrázek barevně zvýrazňuje jednotlivé části souboru typu intel-hex:
Data oblasti jsou rozdělena do tří datových záznamů, kterým předchází záznam definující segmentovou adresu 100016. K offsetovým adresám následujících datových záznamů tedy přičítáme 1000016. Když uvažujeme adresování paměti po bajtech, pak tato ukázka definuje obsah spojité oblasti 48 bajtů od adresy 1400016 (14000h v notaci assembleru, 0x14000 v notaci C-jazyka).
Struktura záznamu
Intel-Hex je z formálního hlediska textový soubor kódovaný pomocí standardu ASCII. Jak už bylo řečeno, jeden záznam je zde reprezentován jedním řádkem textového souboru.
[0. znak] ... ':'
Pro ostatní viditelné znaky na řádku platí, že dvojice znaků vždy reprezentuje jeden bajt. Tento bajt je zapsaný pomocí dvou ASCII znaků, které mohou nabývat hodnoty '0' - '9' a 'A' - 'F' pro šestnáctkové číslice 0 - 9 a 10 - 15. Takže například bajt zapsaný jako "10" má desítkovou hodnotu 16 (tj. 1*16 + 0), bajt zapsaný jako "E1" má desítkovou hodnotu 225 (tj. 14*16 + 1) atp.
[1. až 2. znak] ... N = počet bajtů
N určuje čistou velikost obsahu datové oblasti záznamu v bajtech. Např. '10' (tj. 1016) znamená 16 bajtů dat, pro běžný segmentový záznam je zde '02' (2 bajty dat) atd. Protože 1 bajt je v ACII-hex kódování reprezentován dvěma znaky, je tato datová oblast reprezentována v datovém záznamu 2N znaky.
[3. až 6. znak] ... offset adresy
Offset adresy má smysl pro datový záznam, je uveden v 'lidsky čitelném' pořadí nejprve MSB (významnější bajt) pak LSB (méně významný bajt). Pokud je tedy 3. až 6. znak např. '1234', znamená to offset 123416 (decimálně 4660). Adresy jsou obvykle bajtové (tj. adresa specifikuje pořadí bajtu v paměti), u systémů nedovolujících bajtovou adresaci může (ale nemusí) být interpretace adresy odlišná (např. může jít o pořadí slova nebo dvojslova).
[7. až 8. znak] ... typ záznamu
- '00' ... datový záznam
- '01' ... konec souboru
- '02' ... segmentový záznam (nejprve MSB)
- '03' ... startovací záznam (adresa daná jako segment(16 bitů) a offset(16 bitů); nejprve MSB)
- '04' ... rozšířený adresový záznam (nejprve MSB)
- '05' ... startovací záznam (32bitová lineární adresa; nejprve MSB)
[9. až 8.+2*N znak] ... datová oblast záznamu
Význam datové oblasti záznamu závisí na typu záznamu. Adresové záznamy mívají pořadí bajtů od nejvýznamnějšího k nejméně významnému, aby byly přímo lidsky čitelné jako hexadecimální číslo. Datový záznam má u systémů dovolujících adresaci po bajtech pořadí od nejnižší adresy k nejvyšší, u systémů nedovolujících adresaci po bajtech záleží interpretace na výrobci softwarových nástrojů (většinou je respektována konvence daná výrobcem hardware).
[9.+2*N až 10.+2*N znak] ... kontrolní součet řádku
Součet hodnot hexa bajtů řádku modulo 256 musí dát nulu.
Posledním znakem řádku je odřádkování, které v textovém souboru normálně neuvidíme. Toto odřádkování může být realizováno znakem LF (tj. 0x0A), sekvencí znaků CR+LF (tj. 0x0D, 0x0A), případně znakem CR (0x0D), podle toho zda nástroje generující HEX soubor upřednostňují zvyklosti operačního systému Unix, MS-DOS/MS-Windows, případně MacOS.
Datová oblast datového záznamu (typ 00)
[9. až 8.+2*N znak] ... data pro zápis od dané adresy paměti.
V jednom záznamu bývá obvykle obsažena pouze část adresy (tzv. offset). Data jsou obvykle ukládána do paměti cílového systému po bajtech v pořadí od nejnižší adresy do nejvyšší. U systémů neumožňujících adresování paměti po bajtech je třeba zjistit jakým způsobem je Intel HEX interpretován.
Datová oblast segmentového záznamu (typ 02)
[9. až 12. znak] ... nová segmentová adresa platná pro další záznamy.
Na začátku je segmentová adresa rovna 0.
Segmentová adresa se uvádí v 'lidsky čitelném' pořadí nejprve MSB, poté LSB. Např. záznam
:020000021000EC
definuje segmentovou adresu 100016 (v desítkové soustavě 4096).
Fyzická adresa = 16*(segmentová adresa) + offset
Datová oblast rozšířeného adresového záznamu (typ 04)
[9. až 12. znak] ... obsahuje vyšších 16 bitů adresy
Fyzická adresa = 65536*(vyšších 16 bitů adresy) + offset
- je otázka, zda je možné v jednom souboru kombinovat záznamy typu 02 a záznamy typu 04, a pokud ano zda a jak se kombinuje segment s rozšířenou lineární adresou.
Zakončení (typ 01)
:00000001FF
Starší software údajně může používat pro zakončení prázdný datový záznam:
:0000000000
Odkazy
Související články
Externí odkazy
- Intel Hexadecimal Object File Format Specification 1988 (PDF)
- Format description at PIC List
- Format description
- SRecord, multi-platform GPL'ed tool for manipulating EPROM load files.
- Binex, a converter between Intel HEX and binary.
Média použitá na této stránce
Ukázka části Intel-hex souboru s popisem