【问题标题】:Why is the uploaded binary size so much smaller than the actual size?为什么上传的二进制文件大小比实际大小小很多?
【发布时间】:2012-11-15 05:37:39
【问题描述】:

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

【问题讨论】:

  • 尝试创建一个 .bin 文件...它的大小可能合适也可能不合适,但可能是一个更好的指标。 .elf 格式的内容远不止被加载的字节。 .hex 文件有一些额外的东西,并且在 ascii 中,所以你有两倍的字节数,然后添加额外的。这些文件格式都记录在维基百科和其他地方
  • 不是二进制比文件小,而是文件比二进制大。

标签: embedded avr msp430


【解决方案1】:

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

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

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

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

【讨论】:

  • ELF 二进制文件中也可能包含符号。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-13
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多