10

我只使用过 AVR 和 MSP430,但对它们来说都是如此。编译和静态链接后,我的最终 ELF 二进制文件大约是 208kB,而 Intel Hex 二进制文件大约是 41kB。AVRDUDE 告诉我它正在上传大约 18kB。这里到底发生了什么?

4

3 回答 3

13

我最终的 ELF 二进制文件大约是 208kB

是的,因为 ELF 不是原始机器代码。它是一种通用的可执行格式,具有重定位信息、动态加载信息、只读数据的不同部分、可写数据和代码等。其中大多数与微控制器无关,因为它没有操作系统,没有动态加载设施,所以大多数额外的信息可以被剥离。

Intel Hex 二进制文件大约为 41kB。AVRDUDE 告诉我它正在上传大约 18kB。

两个原因。一,英特尔十六进制文件在每行末尾包含校验和。如果您使用合理的平均行长度来剪切这些文件,您可以预期文件会缩小几个百分点,例如缩小到 36kB。然后,英特尔 Hex 文件被命名为“hex”文件是有原因的。它们不包含原始二进制数据,而是十六进制形式的原始二进制数据——即一个真实字节使用两个字节编码。因此,当 AVRdude 上传代码时,它会将其转换为原始二进制文件(这是 AVRs 处理器可以运行的),然后数据大小再次减少了 50%。

于 2012-11-15T05:57:08.457 回答
1

目标代码包括额外的元数据,包括符号表和调试器信息。如果您使用的是 GNU 工具链,大多数数据通常可以通过编译器和/或链接器选项或strip实用程序剥离。

一个十六进制文件使用 2 个十六进制数字字符来表示一个字节,加上记录开销,所以总是比二进制长度略多一点。

于 2012-11-15T11:45:34.803 回答
0

正如上面其他人所说,HEX 文件格式是 ascii 可打印的,这使得通过通信链接(例如 7 位调制解调器/终端)传输更容易,与 Motorola .s19 非常相似:

http://en.wikipedia.org/wiki/Intel_HEX

http://en.wikipedia.org/wiki/S19_%28file_format%29

于 2012-11-15T14:49:39.327 回答