我只使用过AVR和MSP430,但这两者都是如此。在编译和静态链接之后,我的最终ELF二进制大约为208kB,而Intel Hex二进制大约为41kB。 AVRDUDE告诉我它正在上传约18kB。这里究竟发生了什么?为什么上传的二进制大小比实际大小要小得多?
8
A
回答
10
我最后的ELF二进制是208KB
各地
是的,因为ELF是不是原始的机器代码。它是一种通用的可执行格式,它具有重定位信息,动态加载信息,只读数据的不同级别,可写数据和代码等。这些大多数与微控制器无关,因为它没有操作系统,没有动态加载设施,所以大多数额外的信息都可以被剥离。
Intel Hex二进制码约为41kB。 AVRDUDE告诉我它正在上传约18kB。
有两个原因。其中一个英特尔十六进制文件包含每行结尾的校验和。如果使用合理的平均线长度来剪切这些文件,您可以预期文件会缩小几个百分点,例如达到36kB。然后,有一个原因英特尔十六进制文件被命名为'十六进制'文件。它们不包含原始二进制数据,而是包含十六进制格式的原始二进制数据 - 我。即一个真正的字节使用两个字节进行编码。所以当AVRdude上传代码时,它会将其转换为原始二进制文件(这是AVR处理器可以运行的内容),然后数据大小再次减少50%。
0
目标代码包含附加的元数据,包括符号表和调试器信息。如果您使用的是GNU工具链,则大多数数据通常可能会被编译器和/或链接器选项或实用程序剥离。
一个十六进制文件使用2个十六进制数字字符来表示单个字节,再加上记录开销,因此总是比二进制文件长度的两倍多一点。
0
正如其他上面所说的,HEX文件格式是ascii的可印刷这使得更容易超过COMMS链路(例如7位调制解调器/终端),非常类似于摩托罗拉名为.s19转移:
相关问题
- 1. 为什么最终的二进制文件的大小比静态库的大小要小得多?
- 2. 为什么.sqlite DB的大小比Realm小得多?
- 3. 什么是顶点缓冲区大小的实际大小限制?
- 4. 二进制文件大小
- 5. Lisp二进制大小
- 6. ARM二进制大小
- 7. 定义的大小不会屏幕上的实际大小
- 8. 文件的实际大小
- 9. 是byte []的byte.length()的最大大小还是实际大小?
- 10. 为什么mysql HEX更改二进制列大小写?
- 11. 为什么在窗口大小上需要最小宽度?
- 12. 实际大小在ActionScript 3
- 13. JavaScript上传大小限制
- 14. SugarCRM:ImageField上传大小限制
- 15. 什么是GKSession sendData的实际数据大小限制:toPeers:withDataMode:error:?
- 16. 图像显示比我的div上的实际图像大小大很多
- 17. FFT的大小实际上是什么意思
- 18. 为什么调整大小的PNG图像比原始图像大得多?
- 19. 优化QT的二进制大小?
- 20. 安装的apk大小超过apk的实际大小
- 21. Laravel最大上传大小限制
- 22. 最大上传大小?
- 23. iTunes连接上传问题(二进制大小)
- 24. 为什么XML最大实体大小受bug修复限制
- 25. 为什么在InnoDB中索引大小大于数据大小?
- 26. 调整图像大小二进制
- 27. 确定直方图二进制大小
- 28. 为什么当大小
- 29. 为什么要减小Java JVM线程堆栈的大小?
- 30. 获取实际文件大小VS表观大小在GO
尝试创建一个.bin文件...它也可能是也可能不是正确的大小,但可能是一个更好的指标。 .elf格式比只有加载的字节有更多的东西。 .hex文件有一些额外的东西,并在ascii中,所以你有两倍多的字节在门外,然后添加额外的。这些文件格式全部记录在维基百科和其他地方 –
这不是说二进制文件比文件大于二进制文件。 –