Generování, formát a zápis Intel HEX s kratšími řádky

Ahoj mám prosbu…přikládám vygenerovaný HEX soubor pro ATmega32

:106420000232272F0C940332DC01CB01FC01E199ED
:10643000FECF06C0FFBBEEBBE09A31960DB20D92C7
:0C64400041505040B8F70895F894FFCF89
:10644C003E5149453E0000427F40000042615149A7
:10645C0046002141454B31001814127F100027458E
:10646C00454539003C4A4949300001710905030092

Zajímalo by mě, proč kompilátor na třetím řádku najednou řekl, že se zapíše jen 12bajtů. Od tohoto řádku dává vždy k adrese offset +12. Někde v kódu se to zase dorovná na offset nula.
Také by mě zajímalo, jestli může být někde mezera v adresách a pokud ano tak proč. Nikde jsem o tomto problému nic nenašel, ale zajímá mě to z důvodu tvorby bootloaderu.

Dík

:arrow_right: administrator: přejmenováno z "AVR a generování HEX souboru"

První 2 HEX znaky řádku znamenají délky, proto se v 3. řádku zapisuje jen 12 bajtů. Zápisová adresa na dalším řádku 4 bajty přeskočila, to je formátem souboru povolené.

To dovolení je někde definované, nebo to musím příjmout jako fakt? Bylo by povolené i to, kdyby se najednou skočilo o nějaký offset? Docela by mi to zhatilo situaci. Byl bych nejradši, kdyby v tom hexu byla 100% souvislá řada bajtů od nuly až do konce.

To je vlastnost hex. formátu. Zapisují se jenom adresy na kterých je kód (nebo data).
Ten hex soubor vytváří překladač.
Když např. překládá bootloader, který začíná na adrese 7000, tak by bylo asi zbytečné zapisovat všechny adresy od nuly (na každé do těch 7000 by bylo 0xff).
Nevím proč by se ti to líbilo víc.

s tímto tvrzením souhlasím, ale nechápu jak to s tímto souvisí.

Tento kód říká, že od adresy 0x6440 zapíše 12 znaků…

0C64400041505040B8F70895F894FFCF89

a tento kód říká, že od adresy 0x644C zapíše 16 znaků

10644C003E5149453E0000427F40000042615149A7

z tohoto vyplývá, že kompilátor najednou posunul adresový offset o 0xC0 bez jakékoliv pochopitelné pčíčiny resp. né mě známé…mě to v programu ničemu nevadí, jen mě zajímá proč se to děje. Přeci si to překladač jen tak nevymyslí.

Co se týče toho důvodu tak ten je tento:
Budu předpokládat dvě situace, kdy zapisuji pouze program a ne bootloader…
A. HEX soubor má data adresované od adresy nula až do maxima programu
B. HEX soubor má najednou mezeru končí adresou 0x5000 a pokračuje 0x6000.
V případě A je vše v pořádku. V případě B je to komplikace, protože nemůžu do flešky jednoduše zapsat všechna data. Každý řádek kódu budu muset otestovat na adresu a zapsat na tu správnou.

Nechej si vygenerovat BIN formát a ten budeš mít spojitý.

Tu sa predsa jedna o suvisle pole bajtov. Ci?
Len v tretom riadku zapisal 12B a na dalsom od nasledujucej adresy pokracuje v zapise 16B. Osobne ziadnu nekonzistenciu nevidim.

Ti moze byt sumak, ci tych 12B zapise az na poslednom riadku, alebo niekde “po ceste”. Nie kazdy program musi byt celociselnym nasobkom 16-tich.

Jé Martine máš pravdu, přehlédl jsem, je tam adresa 644C a ne 6450, takže pokračuje spojitě.

Popis formátu Intel HEX souboru: en.wikipedia.org/wiki/Intel_HEX

No asi můj dotaz zůstal stále nepochopený…
Nepsal jsem nic o tom, že by to nebylo spojité, ale o tom, že to bylo rozdělené na více řádků. Na dalším řádku kód pokračuje spojitě, ale s offsetem (v tomto přídadě 0x0C). Proč se toto stalo? Kompilátor k tomu přeci můsí mít důvod. Ze začátku jsem myslel, že je to třeba konec nějaké funkce, nebo definice proměné, ale ze souboru map ani m51(u překladače keil) z výpisu nebylo nic zřejmé. Zůstává to tedy pro mě záhadou a těší mě, že zřejmě nejsem sám…aneb profesionálem snadno a rychle :smiley:

Jinak v tom popisu HEX formátu se o tom nic nepíše…

Nelinkoval v tom místě různé obj moduly?

To je jedno z možných vysvětlení.

Moje *.hex sa skladaju tak z 10 az 17 obj, ale anomalie v dlzke riadkov sa deju vyhradne na konci *.hex (AVRstudio, GCC, vela verzii)

:100000000C946C010C948B010C948B010C948B015F
:100010000C948B010C948B010C948B010C948B0130
...
:1073C000DC01FC01672F71917723E1F7329704C04C
:1073D0007C916D9370836291AE17BF07C8F30895D7
:0473E000F894FFCF4F
:1073E40064010509010101FF14010081000000810D
:1073F4000000008100000001010101010101FFFF03
:10740400FFFFFFFF00810000008100000000FF007B
:08741400008100000001FF00EF
:00000001FF

alebo

:100000000C94AE000C94CB000C94CB000C94CB0061
:100010000C94CB000C94CB000C94CB000C941C02E1
...
:1020F000DC01FC01672F71917723E1F7329704C06F
:102100007C916D9370836291AE17BF07C8F30895F9
:04211000F894FFCF71
:10211400C8C82C012C012C01050005000500FFF4A2
:1021240001102705B8B8B8B8B8B8B8B8B8B8C80076
:00000001FF

ak to teda niekomu pomoze v analyze anomalii. Nemyslim, ze by to malo byt roznymi obj modulmi.

S tím, že v hex souboru je kratší řádek už jsem se setkal, ale nikdy jsem nad tím nedumal.

Myslím, že v žádném případě nedá překladač mezeru tam kde v kódu není.

Martin:
Tento kód dal kratší řádek i na začátek:

[code].CSEG
.org 0
rjmp start

.org WDTaddr // byte_adr 0x18
sbi portb,1


[/code]

Ten přeskakuje prostor.

Martine ve Tvém kódu tam začíná inicializace datových proměnných, jiný segment, proto začíná od začátku řádku.