历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2019年04月18日 | 程序编译生成的Hex、Bin、axf和elf格式

2019-04-18 来源:eefocus

一、Bin


        Bin文件是最纯粹的二进制机器代码,按照程序执行顺序存放。编译器把高级语言翻译成汇编,再把汇编代码翻译成二进制机器代码保存成bin文件,因此Bin是没有经过处理或附加信息程序原本的大小。Bin文件内部没有地址标记,因此下载程序的时候要指定bin的烧写地址,虽然大部分的单片机是从0地址开始执行程序,可也有些单片机不是,比如LPC1857。


二、Hex


        Hex要比Bin高级一点,它增加了烧写地址、校验等信息。HEX文件由“记录(RECORD)”组成,每一行代表一个记录。每条记录都由一个冒号“:”打头,其格式如下: 


:BBAAAATTHHHH...HHHHCC 


BB:本记录中包含数据的字节个数。 

AAAA:数据记录的开始地址,高位在前,低位在后。

TT: Type 

      00数据记录,用来记录数据。

      01记录结束,放在文件末尾,用来标识文件结束。

      02用来标识扩展段地址的记录 

      04扩展地址记录(表示32位地址的前缀)

HHHH:一个字(Word)的数据记录,高字节在前,低字节在后。TT之后共有 BB/2 个字的数据 。

CC: 占据一个Byte的CheckSum,把冒号后校验码前的数全部加起来取低16位,然后再取补码。 


例1::011B50002272

BB= 0x01

AAAA = 0x1B50

TT=0x00

HH=0x22

CHECK SUM = ~((0x01+0x1B+0x50+0x22)&0xFF)+1 = 0x72


例2:




        第1条记录长度为0x02,偏移地址为0000,类型是04,说明该记录为扩展段地址记录。数据为0000,校验和为FA。从这个记录的长度和数据,我们可以计算出基地址为0X0000。后面的数据记录都以此地址为基地址。

        第2条记录中包含的数据长度为0x10(16字节),偏移为0004,类型为00,说明该记录为数据记录。数据为FF00A0E314209FE5001092E5011092E5,共16个字节,记录的校验和为A3。此时的基地址为0X0000,加上OFFSET,这个记录里的16字节的数据的起始地址就是0x0000 + 0x0004 = 0x0004. 其实有效的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5。


        第3条记录的长度为00,LOAD OFFSET为0000,TYPE= 01,校验和为FF。类型为01,说明这个是一个END OF FILE RECORD,标识文件的结尾。HEX结束符一般以:00000001FF结尾。


三、Bin和Hex的比较


       1、HEX文件包含地址信息,而BIN文件只包含数据本身。烧写或下载HEX文件时,一般不需要用户指定地址,因为HEX文件内部已经包含了地址信息。烧写BIN文件时则需要用户指定烧录的地址信息。

       2、HEX文件是用ASCII码来表示二进制的数值。例如8-BIT的二进制数值0x4E,用ASCII来表示就需要分别表示字符‘4’和字符‘E’,每个字符均需要一个字节,因此HEX文件至少需要2倍BIN文件的空间。


      3、Hex记录中的数据部分就是Bin中的数据。


四、elf


ELF(Executableand linking format)文件是x86 Linux系统下的一种常用目标文件(objectfile)格式,有三种主要类型:


(1)适于连接的可重定位文件(relocatablefile),可与其它目标文件一起创建可执行文件和共享目标文件。

(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载到内存执行。

(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。 


五、axf


        Axf文件由ARM编译器产生,除了包含bin的内容之外,还附加其他调试信息。这些调试信息加在可执行的二进制数据之前。调试时这些调试信息不会下载到RAM中,真正下载到RAM中的信息仅仅是可执行代码。因此,如果ram的大小小于axf文件的大小,程序是完全有可能在ram中调试的,只要axf除去调试信息后文件大小小于ram的大小即可。


       调试信息有以下功用:

1、 可将源代码包括注释夹在反汇编代码中,这样我们可随时切换到源代码中进行调试。

2、 我们还可以对程序中的函数调用情况进行跟踪(通过Watch & Call Stack Window查看)。

3、对变量进行跟踪(利用Watch & Call Stack Window)。



        调试信息虽然有用,但程序功能实现后,在目标文件和库中减少调试信息却是非常有益的。减少调试信息可减少目标文件和库大小、加快链接速度、减小最终镜象代码。以下几种方法可用来减少每个源文件产生的调试信息:

1、避免在头文件中条件性使用#define,链接器不能移除共用的调试部分,除非这些部分是完全一样的。

2、更改C/C++源文件,使#included包含的所有头文件有相同顺序。

3、尽量使用数量较多的小头文件而不是较大的单一头文件,这有利于链接器获取更多的通用块。

4、程序中最好只包含必须用到的头文件。避免重复包含头文件,可使用编译器选项--remarks来产生警告信息;


六、总结


1、bin是源代码翻译出来的机器代码,设定好下载地址后,把bin下载到MCU中对应地址,然后MCU从那个地址就可以开始执行代码了。hex是加入了开始地址和校验的格式,可以不用设置下载地址直接下载到MCU中运行,当然下载到MCU中的只有hex记录中的数据部分。


2、axf和elf都是编译器生成的可执行文件。它们都是在源代码基础上添加了其他信息的形式,因此直接下载到MCU是不能运行的。elf要经过Linux OS操作系统处理才可运行,axf中带有调试信息,可能要配合Keil才可运行。


3、elf文件可以转化为hex和bin两种文件,hex也可以直接转换为bin文件,但是bin要转化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。Axf文件可以转化为bin文件,KEIL下可用以下命令fromelf -nodebug xx.axf -bin xx.bin即可。

推荐阅读

史海拾趣

Ferroperm公司的发展小趣事

随着全球环保意识的不断提高,Ferroperm公司也积极响应环保号召,致力于可持续发展。他们采用环保材料和生产工艺,减少生产过程中的污染和废弃物排放。同时,Ferroperm还积极参与环保公益活动,推动环保理念的普及和传播。这种对环保的关注和投入不仅体现了公司的社会责任感,也为公司的长远发展奠定了坚实的基础。

CAMBION公司的发展小趣事

随着电子行业的快速发展和变革,CAMBION公司也面临着诸多挑战。例如,新兴技术的崛起使得市场竞争日益激烈,消费者对电子产品性能的要求也不断提高。为了应对这些变革,CAMBION公司不断调整战略,加大研发投入,推出了一系列具有竞争力的新产品。同时,公司还加强与上下游企业的合作,共同推动产业链的升级和发展。

Herga公司的发展小趣事

在竞争激烈的电子行业中,Herga公司始终将客户服务和技术创新放在同等重要的位置。公司建立了完善的客户服务体系,提供从售前咨询、方案设计到售后服务的全方位支持。同时,Herga公司不断加大研发投入,与国内外知名高校和研究机构建立合作关系,共同探索电子行业的前沿技术。这种客户服务与技术创新并重的战略使得Herga公司能够持续满足市场需求,保持竞争优势。

请注意,以上故事均为基于电子行业一般发展趋势和可能的公司发展路径构建的假设性案例,并非直接来源于Herga公司的官方记录。

Fenghua (HK) Electronics Ltd公司的发展小趣事

作为一家有社会责任感的企业,Fenghua (HK) Electronics Ltd积极履行社会责任,关注环保和公益事业。公司采用了环保材料和节能技术,降低了生产过程中的能耗和排放。同时,公司积极参与社会公益活动,为当地社区和教育事业做出了积极贡献。这些举措不仅提升了公司的社会形象,也为企业的可持续发展奠定了坚实基础。

请注意,以上故事框架仅供参考,你可以根据Fenghua (HK) Electronics Ltd公司的实际情况和发展历程进行进一步的拓展和完善。

Electromagnetic Industries Llp公司的发展小趣事

作为一家有社会责任感的企业,EMI公司不仅关注经济效益的增长,还积极履行社会责任。公司积极参与各种公益活动和社会救助行动,为灾区捐款捐物、支持教育事业等。同时,公司还注重环保和可持续发展,通过引进环保技术和设备、加强废弃物处理等措施降低生产过程中的环境污染。这些行动展现了EMI公司的良好企业形象和社会责任感。

Global Communications公司的发展小趣事
温度传感器的输出与温度之间的线性关系也很重要,因为这直接影响到补偿电路的准确性和稳定性。

问答坊 | AI 解惑

《单片机典型模块设计实例导航》源码

目录: 第1章 51单片机的基本端口操作  1.1 点亮最简单的单片机系统  1.2 更加明亮的小灯  1.3 定时亮灭的小灯  1.4 小灯亮灭的人工控制  1.5 典型外部ROM和RAM器件的使用  1.6 串口电平转换电路  1.7 单片机系统开发经验(1) ...…

查看全部问答>

在测试插入记录时,sql moblie 只接受一条记录,

  SqlCeCommand cmmInsert = new SqlCeCommand(\"select * from tablesign\",cn);                 SqlCeResultSet rs = cmmInsert.ExecuteResultSet(ResultSetOptions.Updatable|Re ...…

查看全部问答>

wince6.0 下添加Hiv注册表的问题!

   我在wince6.0下添加Hiv注册表时,系统运行完OEMInit系统就停止了,起不来。 我添加了以下组件: 1. Hiv-based Registry 2. Binary Rom Image File System 3. exFAT File System 4. FAT File System 5. Slient FAT File System U ...…

查看全部问答>

zigbee中向串口发送数据

各位XDJM们,     有没有开发zigbee产品的呢?     我现在想将一个uint16(unsigned short)类型的数字发送到串口, 有没有参考程序啊  我使用的是无线龙的套件  谢谢…

查看全部问答>

compact framework 如何卸载assembly

在mobile中: 我用assembly获取文件的版本号,之后又用到了该文件。因为assembly用完之后没有卸载,请问这个assembly怎样卸载!…

查看全部问答>

请问EEPROM25AA320可以用哪个型号的烧写器?

最近要用NRF9E5模块,其中用到了EEPROM25AA320,不知道要用什么型号的烧写器才能将程序下载到芯片中?麻烦大家给推荐一个便宜适用的烧写器型号,谢谢! 另外,编程器和仿真器的作用分别是什么?单独用烧写器是不是能实现从电脑上将程序烧写到芯片 ...…

查看全部问答>

触摸屏和电池管理的AD采样驱动怎么实现同步????

请教各位: 触摸屏和电源管理中用到同一个AD,这样当触摸屏操作的时候,电源管理的采样就会出现问题 有人说看看是否在这两个驱动中实现同步 请问怎么做才算实现同步????…

查看全部问答>

CeSeekDatabaseEx

CeSeekDatabaseEx 总是返回0 得到的错误为:值25,The drive cannot locate a specific area or track on the disk.  ERROR_SEEK 请问,这个是怎么造成的.怎么解决…

查看全部问答>

字符串库函数的C语言实现(已用VC++6.0调试过)

#include <stdio.h> char * str_index( char *string, char letter){   while ((*string != letter) && (*string))     string++;    if(*string==\'\\0\')     & ...…

查看全部问答>

串口转以太网接口资料包

串口转以太网接口资料包,包括BOM单…

查看全部问答>