几种常见格式的区别;
一、bin文件
Bin文件是最纯粹的二进制机器代码, 或者说是”顺序格式”。按照assembly code顺序翻译成binary machine code,内部没有地址标记。Bin是直接的内存映象表示,二进制文件大小即为文件所包含的数据的实际大小。
BIN文件就是直接的二进制文件,一般用编程器烧写时从地址0x00开始,而如果下载运行,则下载到编译时的地址即可。可以直接在裸机上运行。
二、hex文件
Intel hex 文件常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。 就是机器代码的十六进制形式,并且是用一定文件格式的ASCII码来表示。
HEX文件由记录(RECORD)组成。在HEX文件里面,每一行代表一个记录。每条记录都由一个冒号“:”打头,其格式如下:
文件格式:
:BBAAAATTHHHH…HHHHCC
含义分别如下:
BB:字节个数;
AAAA:数据记录的开始地址,高位在前,低位在后;
TT: Type ;
Type:
00数据记录,用来记录数据;
01记录结束,放在文件末尾,用来标识文件结束;
02用来标识扩展段地址的记录;
04扩展地址记录(表示32位地址的前缀);
HHHH:一个字(Word)的数据记录,高字节在前,低字节在后;
TT之后共有 BB/2 个字的数据 。
CC: 占据一个Byte的CheckSum;
举例:
每行中的数据并不是一定有的,第二个字节数据长度为0,那么这行就没有数据。
由于每行标识数据地址的只有2Byte,所以最大只能到64K,为了可以保存高地址的数据,就有了Extended Linear Address Record。如果这行的数据类型是0x04,那么,这行的数据就是随后数据的基地址。例如:
:020000040004F6
:1000000018F09FE518F09FE518F09FE518F09FE5C0
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D
:00000001FF
第一行,是Extended Linear Address Record,里面的数据,也就是基地址是0x0004;
第二行是Data Record,里面的地址值是0x0000。那么数据18F09FE518F09FE518F09FE518F09FE5要写入FLASH中的地址为 (0x0004 << 16) | 0x0000,也就是写入FLASH的0x40000这个地址。
同样,第三行的数据的写入地址为0x40010。当一个HEX文件的数据超过64k的时候,文件中就会出现多个Extended Linear Address Record。
校验值:每一行的最后一个值为此行数据的校验和。例如:
:1000000018F09FE518F09FE518F09FE518F09FE5C0 这行中的 0xC0;
:1000100018F09FE5805F20B9F0FF1FE518F09FE51D 这行中的 0x1D;
校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和。
如手头的STM32 HEX 第一行 020000040800F2;
End of File Record 行是每一个HEX文件的最后一行。例如:
:00000001FF;
这样的一行数据内容是固定的,数据长度为0,地址为0。
hex和bin文件的区别:
1、HEX文件包含地址信息而BIN文件只包含数据本身,烧写或下载HEX文件时,一般不需要用户指定地址,因为HEX文件内部已经包含了地址信息。烧写BIN文件时则需要用户指定烧录的地址信息。
2、HEX文件是用ASCII码来表示二进制的数值。例如8-BIT的二进制数值0x4E,用ASCII来表示就需要分别表示字符‘4’和字符‘E’,每个字符均需要一个字节,因此HEX文件至少需要2倍BIN文件的空间。
三、elf文件
ELF(Executableand linking format)文件是x86 Linux系统下的一种常用目标文件(objectfile)格式,有三种主要类型:
- 适于连接的可重定位文件(relocatablefile),可与其它目标文件一起创建可执行文件和共享目标文件;
- 适于执行的可执行文件(executable file),用于提供程序的进程映像,加载到内存执行;
- 共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像;
小结:可由elf文件转化为hex和bin两种文件,hex也可以直接转换为bin文件,但是bin要转化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。
四、axf文件
Axf文件由ARM编译器产生,除了包含bin的内容之外,还附加其他调试信息,这些调试信息加在可执行的二进制数据之前。调试时这些调试信息不会下载到RAM中,真正下载到RAM中的信息仅仅是可执行代码。因此,如果ram的大小小于axf文件的大小,程序是完全有可能在ram中调试的,只要axf除去调试信息后文件大小小于ram的大小即可。
调试信息有以下功用:
可将源代码包括注释夹在反汇编代码中,这样我们可随时切换到源代码中进行调试。
我们还可以对程序中的函数调用情况进行跟踪(通过Watch & Call Stack Window查看)。
- 对变量进行跟踪(利用Watch & Call Stack Window)。
调试信息虽然有用,但程序功能实现后,在目标文件和库中减少调试信息却是非常有益的。减少调试信息可减少目标文件和库大小、加快链接速度、减小最终镜象代码。以下几种方法可用来减少每个源文件产生的调试信息:
避免在头文件中条件性使用#define,链接器不能移除共用的调试部分,除非这些部分是完全一样的。
更改C/C++源文件,使#included包含的所有头文件有相同顺序。
尽量使用数量较多的小头文件而不是较大的单一头文件,这有利于链接器获取更多的通用块。
程序中最好只包含必须用到的头文件。避免重复包含头文件,可使用编译器选项—remarks来产生警告信息;
axf和elf文件的区别:
- axf和elf都是编译器生成的可执行文件。
- 区别是:ADS编译出来的是AXF文件。gcc编译出来的是ELF文件。两者虽然很像,但还是有差别的。这是文件格式的差别,不涉及调试格式。
- axf/elf是带格式的映象,bin是直接的内存映象的表示。
- Linux OS下,ELF通常就是可执行文件,通常gcc -o test test.c,生成的test文件就是ELF格式的,在Linux Shell下输入./test就可以执行。在嵌入式中,上电开始运行,没有OS系统,如果将ELF格式的文件烧写进去,包含一些ELF格式的东西,arm运行碰到这些指令,就会导致失败,如果用bin文件,程序就可以一步一步运行。