此帖出自聊聊、笑笑、闹闹论坛
最新回复
哈哈,我想表达下我的看法,不一定对,其实我也是有猜测的成分在里面。说的不对,还请指教。
1、首先,针对你提到的“后来在比较我这边和他那边生成的.hex文件时看到里边有一个字节不一样”。
这个我觉得首先要了解hex的结构。因为对碰到像你这样类似的问题,很有帮助。
所以在这里,我想提一下,hex文件的结构,还请不要嫌我麻烦,其实这些东西百度也可以搜到的。我只提几个比较重要的点。如下如果提到hex文件的数据,以stm32为例的。
这个是我为了理解hex而自己整理的,我直接粘贴过来了。
一、
Hex数据的格式组成如下::llaaaatt[dd...]cc:冒号 是每一条Intel HEX记录的开始ll 是这条记录的长度域,他表示数据(dd)的字节数目.aaaa 是地址域,他表示数据的起始地址00 ----数据记录dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,由II域的字节记录的长度来决定。cc 是校验和域,表示记录的校验和,计算方法是将本条记录冒号开始的所有字母对 所表示的十六进制数字都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc. 如:Hex文件的形式如下::100000008806002089010008C9010008CB0100080A:10001000CF010008D3010008D7010008000000004C:10002000000000000000000000000000DB010008EC:10003000DD01000800000000DF010008E101000808:10004000A3010008A3010008A3010008A301000800:10005000A3010008A3010008A3010008A3010008F0:10006000A3010008A3010008A3010008A3010008E0:10007000A3010008A3010008A3010008A3010008D0:10008000A3010008A3010008A3010008A3010008C0:10009000A3010008A3010008A3010008A3010008B0 :表示每一条HEX记录的开始, 10这个代表这行的数据的个数,我们是16(十进制)个字节,用16进制来表就是10. 0000表示地址域.开始地址为0000H.每次地址的递增为(10H),用十进制表示就是每次地址递增16。 如第一行中地址为0000H,那么第二行中地址则为0010H,第三行中地址为0020H,以此类推。 这里的00,表示本行是数据记录类型,在软件处理过程中00不变。0A为校验和,算法如下:(100H)-(10+00+00+00+88+06+00+20+89+01+00+08+C9+01+00+08+CB+01+00+08) mod (100H) 最后的0A,就是以上计算的结果。
这个地方我需要做个说明,hex格式这个我记得intel公司规定的。当然我的这个hex文件开头是(也就是冒号:后面是)10,那么就是十进制的16.也就是这一行有16个字节的数据。那么不同的ide,或者有些编译环境下,有可能还会出现冒号:后面是20,那么就是32.同理20开头就有32个字节的数据。如下图所示:[attach]266436[/attach]
二、还有地方,我需要扯一下,那就是hex文件一开始。例如:(依然以stm32hex为例)我的这个hex文件刚开始的是::020000040800F2[attach]266438[/attach]
对于这个地方,我分开来解释,从开头向右:02表示这一行有2个字节的数据;0000表示地址域这在扩展地址记录中总是0000(这个hex文件格式的规定好像是)。04 表示扩展线性地址记录(hex格式说明有的)。08,00当做数据来看。(其实这里的0800是stm32的flash的起始地址0x08000000的"高16位")。F2就是上面提到的hex文件的校验和。所以,你看到的这个开头(020000040800F2)下面的第一行的:10后面的四个0,也就是00000.这个就是flash的起始地址。后面如果每行的开头都是:10的话,相对应的flash的地址每行都增加16个字节的大小。也就是第一行是:100000xxxxxx等的话,第二行肯定是:100010xxxxxx等。以此类推。
三,还有个地方需要说明:那就是hex文件结束的地方:我依然截图说明
[attach]266440[/attach]
如上图,蓝色的方框中,这个后面的,08000131,这个我看网上有人解释为_main(而不是main函数的入口哦,这里一定要看清了)。这地址改怎么看。我以keil为例。
[attach]266441[/attach]
这个map文件用记事本可以打开,你可以找到这个地址,然后就知道了。
还有红色方框中的,:00000001FF,
00是记录中数据字节的数目,0000这个地址对于EOF记录来说无任何意义,01记录类型是01(文件结束记录标示),FF依然是校验和。(这些都是死的,基本每个hex文件都以它来结束的)
分析:我觉得你提到的“后来在比较我这边和他那边生成的.hex文件时看到里边有一个字节不一样”。这个不一样,可能发生在如下几个地方:1、有可能在hex文件的数据部分,这个应该与你的程序有关系。多个分号,也有肯能会出现哦;2、也有可能出现在上面第三点提到的蓝色方框中的内容中,这个_main函数的入口可能不太一样,我有出现过不一样的情况,但是下载程序进去没有发现问题(程序比较简单);3、有可能因为数据部分的不同,而导致了行里面最后一个字节,那就是校验和不同。所以出现了问题;4、hex文件刚开始,即就是第二点提到的。一般不会有问题,除非可能像keil中如下这个地方设置不同,所以hex出现你说的那个问题呢?(这个地方我事先声明哦,我没有试过,但是我认为,如果这里设置成别的值,hex文件与设置成起始地址,肯定有差异)
[attach]266442[/attach]
所以,以上提到的关注点,还请虾哥参考。感谢。
详情
回复
发表于 2016-11-10 00:37
赞赏 | ||||||||||
|
||||||||||
此帖出自聊聊、笑笑、闹闹论坛
| ||
|
||
| |
个人签名什么都不会,只会水经验,请见谅。如果有什么得罪的地方,请找我们队长..................ID:lcofjp
|
|
此帖出自聊聊、笑笑、闹闹论坛
赞赏 | ||
个人签名我是一头搞电子的猪,猪是一种好色的动物,猪八戒就是代表.
|
||
此帖出自聊聊、笑笑、闹闹论坛
点评赞赏 | ||
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
|
||
此帖出自聊聊、笑笑、闹闹论坛
点评赞赏 | ||
|
||
此帖出自聊聊、笑笑、闹闹论坛
赞赏 | ||
个人签名亚里士缺德
|
||
此帖出自聊聊、笑笑、闹闹论坛
赞赏 | ||
个人签名
在技术突破的道路上没有终点 |
||
此帖出自聊聊、笑笑、闹闹论坛
赞赏 | ||
|
||
此帖出自聊聊、笑笑、闹闹论坛
| ||
个人签名
强者为尊,弱者,死无葬身之地 |
||
此帖出自聊聊、笑笑、闹闹论坛
赞赏 | ||
个人签名
强者为尊,弱者,死无葬身之地 |
||
此帖出自聊聊、笑笑、闹闹论坛
赞赏 | ||
|
||
此帖出自聊聊、笑笑、闹闹论坛
| ||
个人签名
强者为尊,弱者,死无葬身之地 |
||
此帖出自聊聊、笑笑、闹闹论坛
赞赏 | ||
个人签名
强者为尊,弱者,死无葬身之地 |
||
此帖出自聊聊、笑笑、闹闹论坛
赞赏 | ||
个人签名作为一个菜逼,干货并没有多少。唯一会的就是水,所以回帖水分大。望见谅!
|
||
| |
个人签名这个人不懒,但是仕么都没留下
|
|
此帖出自聊聊、笑笑、闹闹论坛
点评 | ||
|
||
| |
|
|
| |
|
|
此帖出自聊聊、笑笑、闹闹论坛
| ||
|
||
| |
|
|
浏览过的版块 |
论坛测评队员
曾经的版主且威望大于2000,或对EEWORLD论坛有突出贡献的坛友
EEWorld Datasheet 技术支持