编译器/汇编器将程序源代码转换为机器代码, 输出到一个文件。
上位机将机器代码烧录到ROM/Flash Memory, 或传输到目标系统以加载执行
平常使用编译器的时候会自动生成相应格式的烧录文件,直接进行烧录即可,但是在有的时候我们需要使用对文件格式进行转换,比较好用刷写文件解析工具推荐使用HexView,也可以使用J-Flash。
若通过BootLoader进行升级,或者需要对文件进行补齐填充的时候,或者需要自己进行文件提取的时候,我们就需要自己编写代码进行解析,搭配上位机等进行文件的烧录。
bin后缀的是一种二进制文件,它的用途是根据用户系统或者电脑内的应用而定。这是文件格式binary的缩写,bin文件没有什么特别之处,直接解析即可。
Bin文件是最纯粹的二进制机器代码,没有格式,或者说是“顺序格式”。按assembly code顺序翻译成binary machine code。由于分析出来Hex文件中的数据域ASCII码表示的十六进制与二进制一一对应,而且我公司DSP又是16位的,以一个word为最小单位,所以四个十六进制ASCII码代表一条机器指令单位或者地址,借于上面分析,编写了工具代码。
他的优点有简单直接, 文件内容地址和memory内容地址一一对应, 直观。
地址连续, 无法跨空间, 二进制需要特殊工具查看内容。
Motorola S-record是由Motorola创建的一种文件格式,它以 ASCII十六进制文本形式传送二进制信息。这种文件格式也可以称为SRECORD、SREC、S19、S28、S37。它通常用于对微控制器、EPROM和其他类型的可编程逻辑设备进行编程。
S-record格式是在1970年代中期为 Motorola 6800处理器创建的。该处理器和其他嵌入式处理器的软件开发工具将生成S-record格式的可执行代码和数据。程序员将读取S-record格式并将数据“刻录”到嵌入式系统中使用的PROM或EPROM中。
这三种文件格式之所以放在一起说明,是因为这几种格式的文件是相同的,除了后缀名不同,文件的排列格式是一样的,没有特别之处。采用同一种方式解析即可。
S-record 格式文件由一系列 ASCII 文本记录组成。这些记录从左到右具有以下结构:
2个字符,一个大写的S(0x53),然后是一个数字0~9,定义了记录的类型 (S0,S1,S2,S3,S5,S7,S8,S9),其中0~9的数字,定义数据类型。
一个字节,表示后面其余部分(地址+数据+校验和)的字节数。该字段最小值为3(两个字节地址字段+1个字节校验和)。
该字段的最小值为 3,最大值为 255 (0xFF)。通常记录有 32 个数据字节。
4或6或8个字符。由记录类型 type 决定。对于S1和S9类型(S19),地址字段为 4 个十六进制数字(2 个字节)。对于S2和S8 record(S28),地址字段为 6 个十六进制数字(3个字节),对于S3和S7 record(S37),地址字段为 8 个十六进制数字(4 个字节)。地址首先以 MSB 发送。地址字节以大端格式排列。
0—64字符。用来组成和说明一个代表了内存载入数据或者描述信息的16进制的值。
一般建议该段最大32字节。S0/S1/S2/S3 类型的最小数据数是0。最大可记录的数据数由地址段来决定,因为数据段最大记录数是255,减去1个字节的校验位,再减去地址段,剩下的才是数据段长度,因此S0/S1最大支持252字节数据,S2最大支持251字节数据,S3最大支持250字节数据。
占一个字节。
Checksum = 取补码( (Byte count + Address + Data) )
S0:S格式文件的第一个记录,表示文件名(含路径),存储地址部分没有使用,以0000置位。此记录表示记录的开始,无需下载到MCU。
S1: 地址为2字节(4个字符)的记录。
S2: 地址为3字节的记录。
S3: 地址为4字节的记录。
S5: 标记本文件的S1、S2、S3记录的个数(此记录不是一个S文件所必须的)。
S7: 地为4字节,表示程序的开始执行地址,代码/数据部分没有被使用,此行表示程序的结束,无需下载到MCU。
S8: 地为3字节,表示程序的开始执行地址,代码/数据部分没有被使用,此行表示程序的结束,无需下载到MCU。
S9: 地为2字节,表示程序的开始执行地址,代码/数据部分没有被使用,此行表示程序的结束,无需下载到MCU。
S01F0000 443A5C50726F6A6563745F335C62696E5C50726F6A6563742E61627371
S0,表示S19文件格式开始;1F为剩余字节数;0000无用;
最后两位71是校验和;
中间的内容是ASCII码。转成字符串就是:D:\Project_3\bin\Project_3.abs.。
S123C000CF2100C6055B134A800BFE4A8000FE0000C015C03100000000000000\n0000000092
S1,表示本条记录存储地址长度为2字节;23(注意为16进制)剩余字节数;
C000表示起始地址;
92表示校验和。即,本行表示将CF2100C6055B134A800BFE4A8000FE0000C015C0310000000000000000000000依次下载到从地址C000开始的一段连续地址中。
S218FE8020F2FEC013EC31270BED31180A30700434F920F10A0B
S2,表示本条记录存储地址长度为3字节,18(16进制数)表示剩余字节数,FE8020表示起始地址,0B为校验和。
校验和的计算:以S2记录为例,校验和 = 0xFF – (0xFE + 0×80 + 0×20 + 0Xf2 + … + 0x0A);## 七. S-Record的实例
Hex 是另一种十六进制格式,指的是Intel-HEX,它是由Intel制定的格式。
它是一种十六进制的文件,是ascii码的文档, 所以不能直接烧到单片机。以行为单位, 每行以冒号 : 开头, 内容全为16进制码。
它也包含了数据类型,数据字段和校验和等信息。
1)HEX文件包含地址信息,BIN文件只包含数据信息。
2)HEX文件是用ASCII来表示十六进制
3)对一个BIN文件而言,文件的大小就是文件包括的数据的实际大小。而对HEX文件而言,看到的文件大小并不是实际的数据的大小:一是因为HEX文件是用ASCII来表示数据,二是因为HEX文件本身还包括别的附加信息。
对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。