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