我只使用过 AVR 和 MSP430,但对它们来说都是如此。编译和静态链接后,我的最终 ELF 二进制文件大约是 208kB,而 Intel Hex 二进制文件大约是 41kB。AVRDUDE 告诉我它正在上传大约 18kB。这里到底发生了什么?
3 回答
我最终的 ELF 二进制文件大约是 208kB
是的,因为 ELF 不是原始机器代码。它是一种通用的可执行格式,具有重定位信息、动态加载信息、只读数据的不同部分、可写数据和代码等。其中大多数与微控制器无关,因为它没有操作系统,没有动态加载设施,所以大多数额外的信息可以被剥离。
Intel Hex 二进制文件大约为 41kB。AVRDUDE 告诉我它正在上传大约 18kB。
两个原因。一,英特尔十六进制文件在每行末尾包含校验和。如果您使用合理的平均行长度来剪切这些文件,您可以预期文件会缩小几个百分点,例如缩小到 36kB。然后,英特尔 Hex 文件被命名为“hex”文件是有原因的。它们不包含原始二进制数据,而是十六进制形式的原始二进制数据——即一个真实字节使用两个字节编码。因此,当 AVRdude 上传代码时,它会将其转换为原始二进制文件(这是 AVRs 处理器可以运行的),然后数据大小再次减少了 50%。
目标代码包括额外的元数据,包括符号表和调试器信息。如果您使用的是 GNU 工具链,大多数数据通常可以通过编译器和/或链接器选项或strip实用程序剥离。
一个十六进制文件使用 2 个十六进制数字字符来表示一个字节,加上记录开销,所以总是比二进制长度略多一点。
正如上面其他人所说,HEX 文件格式是 ascii 可打印的,这使得通过通信链接(例如 7 位调制解调器/终端)传输更容易,与 Motorola .s19 非常相似: