汽车电子 -- Bin、Hex、Srec、s19等文件的区别

2024-03-14 20:40
文章标签 区别 汽车 电子 bin hex s19 srec

本文主要是介绍汽车电子 -- Bin、Hex、Srec、s19等文件的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、烧写文件

烧写文件有很多种格式,比如bin、Hex、s19等。下面对这几种文件格式做一下介绍。

1、bin文件

参看:【嵌入式烧录/刷写文件】-3.1-详解二进制Bin格式文件

什么是bin

bin是binary的缩写,翻译为“二进制”。binary file 二进制文件是一个 非text file 文本文件的计算机文件。binary file 是一种计算机文件格式,它以二进制编码表示文件的内容。这些文件通常包含计算机程序或数据,例如软件/固件、操作系统、文档、音频和视频等。

在嵌入式软件开发中,binary file 通常是软件固件或操作系统的映像文件。binary file 通常用于将代码和数据加载到嵌入式系统的 nonvolatile memory 非易失性存储器(如 flash memory)或其他存储器中。此外,binary file 还可以用于将数据从一个嵌入式系统传输到另一个嵌入式系统。

  • 程序代码的存储和加载:binary file 通常用于将嵌入式系统的程序代码存储在 flash memory或其他存储器中,并在系统启动时加载到RAM中。这样可以将程序代码与嵌入式系统的其他部分(如操作系统和应用程序)分离开来,从而提高代码的可移植性和维护性。
  • 软件/固件升级:binary file 还尝尝用于升级嵌入式系统的软件/固件。嵌入式系统通常包含一个bootloader程序,它负责从flash memory 中加载软件/固件文件并将其烧写到系统中。这个软件/固件通话吃那个是以二进制格式存储的。
  • 数据存储和加载:在许多嵌入式系统中,binary file 也用于存储和加载数据。例如,嵌入式系统可能需要加载图像、声音或视频等多媒体文件。这些文件通常以二进制格式存储,并通过嵌入式系统的应用程序加载到RAM中进行处理。

在操作系统中,可执行文件和库文件通常以二进制格式存储。
在网络通信中,binary file可以被用作数据传输的格式,如HTTP请求和响应、SMTP邮件等。

bin文件的结构

binary file 通常被认为是若干字节序列,这意味着将其用十六进制格式显示,如下图
在这里插入图片描述
在嵌入式软件编译过程中,源代码被编译器编译成机器码,然后以二进制形式存储在可执行文件中。因此,可执行文件包含的二进制代码就是计算机执行的机器码。这些机器码可以直接被MCU解释和执行,从而实现程序的功能。

因此,binary file和机器码的关系可以用简单的公式表示:binary file = 机器码 + 数据。机器码是binary file中最重要的部分,它决定了程序的行为和功能。binary file中只有代码+数据,没有地址信息,所以在使用 binary file 烧录/刷写时,需要指定地址,这一过程一般在烧录/刷写上位机工具上完成。

打开一个bin文件

  • 使用UE软件,软件下载:UEdit
    通过快捷键 ctrl + H 十六进制模式和ASCII模式切换。
    在这里插入图片描述
  • 使用Vector HexView工具打开:
    在这里插入图片描述

2、hex文件

参看:【嵌入式烧录/刷写文件】-2.1-详解Intel Hex格式文件

什么是Intel Hex

Intel Hex格式最初于1973年为Intel的Intellec Microcomputer Development Systems (MDS)设计,以便从纸带上加载和执行程序。它还被用于向Intel指定memory内容,以便生产ROM。1973年,Intel的“软件小组”仅由Bill Byerly和Ken Burget以及作为外部顾问的Gary Kildall组成。从1975年开始,该格式被MCS系列II ISIS-II系统所利用,使用文件扩展名HEX。后来许多PROM和EPROM编程设备接受了这种格式。

Intel Hex文件格式是一种以ASCII文本形式传达二进制的十六进制值信息的文件格式。它通常用于对Microcontroller微控制器、EPROM和其它类型的可编程逻辑器件和硬件仿真器进行编程。在一个典型的应用程序中,compiler编译器或assembler汇编器将程序的源代码(例如C或汇编语言)转换为machine code 机器码,并将其输出到HEX文件中。有些人还将其用作容纳流数据包的容器格式。由此产生的文件常用的扩展名是.HEX或.H86。然后,programmer编程器读取HEX文件,以将机器码写入PROM中,或传输到目标系统进行加载和执行。

Intel Hex的格式

一个Intel Hex文件由一系列ASCII text record组成,一个record的长度将小于或等于92字符。这些record从左到右有以下结构:
在这里插入图片描述
例如:
在这里插入图片描述

  1. Start code:一个ASCII码冒号“:”(其十六进制值 0x3A)字符。
  2. Byte count:两个ASCII码字符,表示Data段中的ASCII码字符对数。最大计数为255(0xFF)。8(0x08),16(0x10)和32(0x20)是常用的data byte数。
  3. Address:四个ASCII码字符,表示Data段的16位起始memory地址偏移量。Data的物理地址是通过将此偏移量添加到先前建立的base address基址来计算的,从而允许memory寻址超过16位地址的64 KB限制。基址默认为零,可以通过各种类型的record进行更改。Base address和address offset始终表示为big endian大端值。
  4. Record type(参见下文的record type):两个ASCII码字符,00到05,定义了Data段的含义。
  5. Data:由2n个ASCII码字符表示的数据组成的序列(既,n组ASCII码字符对)。某些record省略此Data段(n等于零)。data byte的含义和解释取决于应用程序。(4-bit data必须存储在字节(ASCII码字符对)的下半部分或上半部分,也就是说,一个字节只容纳一个可寻址的数据项)。
  6. Checksum:两个ASCII码字符,一个计算值,可用于验证record是否有错误。一个record的checksum是checksum之前record中所有解码的ASCII码字符对值之和的LSB的二进制补码(按位取反,再加1)。

“Record type记录类型”的说明:
Intel HEX有六种标准record type:
在这里插入图片描述

“Record length记录长度”的说明
不同于Motorola S-record(S19/SREC/mot/SX)文件,Intel Hex文件中的record count仅用来表征Data段的长度,record count最大为255,而8(0x08),16(0x10)和32(0x20)是常用的data byte数。

一个record的总长度最大为521个ASCII码字符:

  • Start code为1个ASCII码字符;
  • Byte count为2个ASCII码字符;
  • Address为4个ASCII码字符;
  • Record type为2个ASCII码字符;
  • Data最大255*2个ASCII码字符;
  • Checksum为2个ASCII码字符。

如何计算“Checksum校验和”
下面的record为例,来介绍Checksum的计算:

:208800000A3400090A34000A0A34000B0A34000C0A34000D0A34000E0A34000F0A34001004

Checksum计算过程:

1.对所有Byte count + Address + Record type +Data的ASCII码字符对求和:

20 + 88 + 00 + 00 + 0A + 34 + 00 + 09 + 0A + 34 + 00 + 0A + 0A + 34 + 00 + 0B + 0A + 34 + 00 + 0C + 0A + 34 + 00 + 0D + 0A + 34 + 00 + 0E + 0A + 34 + 00 + 0F + 0A + 34 + 00 + 10 = 2FC。

2.保留最后一个LSB字节,即十六进制字节FC,其二进制为1111 1100。
3. LSB的二进制补码:取反为0000 0011,再加1后为0000 0100,即十六进制字节04。或checksum=FF - FC + 1= 04。

3、s19文件

参看:【嵌入式烧录/刷写文件】-1.1-详解Motorola S-record(S19/SREC/mot/SX)格式文件

什么是Motorola S-record

Motorola S-record是一种文件格式,由摩托罗拉在20世纪70年代中期为Motorola 6800处理器创建,以ASCII文本形式传达二进制信息的十六进制值,其文件格式也可能为:

*.SRECORD,*.SREC,*.S19,*.mot,*.S28,*.S37,*.SX,*.s,*.s1,*.s2,*.s3,*. exo, *.mxt。

在这里插入图片描述

Motorola S-record的结构

一个SREC格式文件由一系列ASCII text record组成,一个S-record的长度将小于或等于78字符。这些record从左到右有以下结构:
在这里插入图片描述
在这里插入图片描述

1.Record start:每条record以大写字母"S"ASCII码字符(十六进制 0x53)开始,代表该Record的开始;

2.Record type:一个"0"到"9"的ASCII码字符(十六进制 0x30到0x39),定义该Record的类型;

3.Byte count:两个ASCII码字符,表示该Record其余部分(Address + Data + Checksum)中的ASCII码字符对数。该段的最小值为3(16-bit address field为4个ASCII码字符,checksum field为为2个ASCII码字符,共3组ASCII码字符对),最大值为255(0xFF),其"00"/“01”/"02 "是非法值;

4.Address:四/六/八个ASCII码字符,由Record type决定。Address byte以big-endian格式排列:从左往右,地址依次增加;

5.Data:2n个ASCII码字符的序列(n组ASCII码字符对)。对于S1/S2/S3 Record,每条Record最多32组ASCII码字符对是典型的,因为它将适合于80个字符宽的terminal screen,尽管16组ASCII码字符对会更容易视觉解码特定地址;

6.Checksum:两个ASCII码字符,是Byte count、Address和Data的两个ASCII码字符对所代表的数值之和的LSB的反码。在C语言中,Sum通过以下方式转换为checksum: 0xFF - (sum & 0xFF)。

“Record type记录类型”的说明

下表描述了10个可能的S-record。S4是保留的,目前没有定义。S6最初是保留的,但后来被重新定义。
在这里插入图片描述

“Record length记录长度”的说明

Byte count = Address + Data + Checksum

Record field = S3,8-hex-character address,64-hex-character data和2-hex-character checksum,共record count = 74-hex-character = 37(0x25) Byte(这个计数忽略了行末的字符串终止符)。
在这里插入图片描述

计算“Checksum校验和”

示例: S1137AF00A0A0D0000000000000000000000000061

相加:13 + 7A+F0 + 0A+0A+0D+00+00+00+00+00+00+00+00+00+00+00+00+00 = 19E(hex) 掩码:保留最后一个LSB字节,即十六进制字节= 9E(hex),其二进制为 1001 1110。
LSB的二进制反码为 0110 0001,即十六进制字节61(hex)。或checksum=FF - 9E = 61

这里需要注意一个知识点,什么是反码什么是补码?
参看:C语言再学习 – 负数
补码=原码取反+1。

二、转换工具

1、SRecord

开源工具SRecord能够解析转换多种映像文件,Binary,Intel,intel_16等数十种文件.

  • srec_cat 转换,合并文件
  • srec_cmp 比较文件,可以比较hex和bin
  • srec_info 查看文件信息

srecord官网下载:http://srecord.sourceforge.net/
下载:srecord-1.63-win32.zip

示例:
将srec转bin脚本:
在这里插入图片描述

2、IntelHex

IntelHex是用Python写的,如其名字,专门用来处理Intel-Hex文件,当然也可以处理bin文件。其用法非常简单。

下载:IntelHex GitHub

  • 安装:
 pip install intelhex

使用方法:python插件intelhex的使用

在离线安装包的解压路径下,调用命名为hex2bin.py的脚本即可实现hex转换为bin。
在这里插入图片描述
复制hex2bin.py至app.bin的测试文件同级路径下。
在这里插入图片描述
执行脚本可得到转换后的bin文件。
在这里插入图片描述

3、Vector HexView

下载:HexView(Vector)V1.12.05
链接:https://pan.baidu.com/s/1RBSYdJhSR0tSsWq-8ZP87w
提取码:wv4a

Vector出品的工具软件HexView是汽车行业内有名的软件,支持增删改查S19、HEX、BIN等格式,并且具有对称、非对称加密、哈希计算、生成消息摘要、数字签名等高级功能。

三、Vector HexView使用

1、命令行选项

在这里插入图片描述

2、使用

参看:编写Bat脚本调用Vecotr工具软件HexView

数据字节对齐、填充

0xff填充app并256字节对齐

Hexview.exe /s boot.bin /AD:0xFF /AL:0x100 /xb -o boot.bin

其中:
/s 以静默模式运行HexView。
/AD:xx 对齐数据
/AL 对齐长度
/XB 以Fiat二进制格式输出数据,包括PRM和bin文件。

生成文件:将bin文件转换为S19文件

将bin文件转换为S19文件

Hexview.exe /s boot.bin /XS:32:2 -o boot.s19

其中:
/s 以静默模式运行HexView。
/XS[:reclinelen[:rectype]] 以摩托罗拉S-Record格式导出。

该格式(S1、S2或S3)将由HexView根据最高地址的大小自动检测到。如果此地址是16位的,则使用S1-记录格式。如果它是24位的,则使用s2记录类型。如果最长为32位,则使用s3记录格式。
但是,选择记录类型可能是有用的,例如,当需要S2或S3时,即使最高地址低于其阈值。在这种情况下,可以选择“rectype”参数。使用以下设置:

  • Rectype = 0: S1-Record
  • Rectype = 1: S2-Record
  • Rectype = 2: S3-Record.
    每个S-Record行的数据字节数可以在recclinelen参数中指定。参数之间用冒号分隔。可以用整数或十六进制格式指定。
    例如:
    HexView intelfile.hex /XS:32 –o srecord.s19
    Hexview myhexfile.S19 /s /xs:16:2 –o mysrecord.s3

生成文件:将hex文件转换为bin文件

参看:【嵌入式烧录/刷写文件】-3.2-S19/Hex文件转换为Bin文件

hexview.exe /s input.hex /XB  -o output.bin

/XB 以Fiat二进制格式输出数据,包括PRM和bin文件。

合并文件

Hexview.exe /s /MT:header.s19;0x00:0x00,0x200+boot.s19;0x1000:0x00,0x2F000 /XS:32:2 -o boot.s19
Hexview.exe /s /MT:boot.s19;0x00:0x00,0x30000+firmware.s19;0x30000:0x00,0xFE000 /XS:32:2 -o firmware.s19
Hexview.exe /s /MT:firmware.s19;0x00:0x00,0x12E000+APP_CAL_VALID_FLAG.s19;0:0x12E000,0x2000 /XS:32:2 -o APP.s19

其中:
/s 以静默模式运行HexView。
/MT:file1 [;offset][:range1][+file2][;offset][:range1]
以透明模式将文件或其部分从文件列表合并到内存中(不覆盖现有数据)。可选偏移量将应用于被合并文件的所有地址。该范围限制了偏移量之前的文件名可以有通配符,如?或*。

首先,需要选择合并操作的类型。合并可以在透明(/MT)或不透明(/MO)模式下完成。两者都不能混合。在一个命令行操作中,只能选择一个。
在透明模式下,所加载的文件数据将不会覆盖内部内存中的数据。不透明模式不会检查数据是否已经存在,并且将无条件地从合并后的文件中加载数据。已经存在的数据可能会被覆盖。
选项扩展:file1[;offset][:‘range’][+file2;offset][:‘range’]
文件名必须直接跟在选项后面,用’:‘或’ = '符号分隔(/Mx:file或/Mx=file)。可以添加一个可选的偏移参数。偏移量可以是正数或负数,以十六进制或整数指定。此外,可以指定从合并文件加载的数据范围。这可以在有或没有偏移的情况下给出。注意,该范围将应用于未移位的数据,然后将应用地址移位操作。
可以使用“+”字符添加进一步要合并的文件来分离下一个要加载的文件。
例如:
/MT:testfile1.hex;0x2000:0x1000,0x4000+cal2.s19;-0x3000:0x1000-0x1FFF
合并testfile1的地址范围0x1000 ~ 0x4fff。十六进制并将这些范围的所有块地址偏移0x2000。然后,合并文件cal2的地址范围0x1000-0x1FFF。S19并将块起始地址更改为-0x3000。注意:/MT和/MO不能合并在一个命令行中。在这种情况下,只使用命令行列表中的最后一个。

删除数据范围

Hexview.exe /s app.s19 /CR:0x00,0x20 /XS:32:2 -o app.s19

/s 以静默模式运行HexView。
/CR:’range1’:’range2’:… 从加载的文件中删除数据范围

参数option /CR用于从加载的数据文件中截取一个范围。它删除指定范围内的所有数据。可以指定多个范围。每个范围必须用冒号“:”分隔。
例如:
/CR:0x1000,0x200
如果存在0x1000-0x11FF范围内的数据段,则该数据将从文件中删除。所有连续的操作都将对不包括本节的数据进行操作。所有其他部分都保持不变。如果该节位于一个段或块内,它将被分割为两个。

填充区域

Hexview.exe /s app.s19 /FR:0x30000,0xFE000 /FP:0xFF /XS:32:2 -o app.s19

/s 以静默模式运行HexView。
/FR:’range1’:’range2’:… 填充区域。
/FP:xxyyzz 填充该参数将作为十六进制格式的数据流处理。由/FR参数使用

此选项用于创建和填充内存区域。如果没有提供/FP参数,HexView将创建随机数据来填充块或区域。否则,/FP参数给出的值将被重复使用。填充操作不触及现有数据。因此,它甚至可以用来填充段之间的数据。范围由其起始和长度指定,用逗号分隔,或者由开始和结束地址指定,用减号分隔(例如/FR:0x1000,0x200:0x2000-0x2FFF)。

CRC校验值

Hexview.exe /s app.s19 /CS9:@0x12DFFC;0x30000-0x12DFFB /XS:16:2 -o app.s19

/s 以静默模式运行HexView。

/CSR用于对加载的数据文件计算校验和。一个数字直接跟在选项后面,用来指定哪个校验和计算方法应使用。数字及其相关校验和如下图所示。当使用“Edit -> Create Checksum”选项时,它也可以在GUI上看到。该数字以十进制值指定,并直接跟随命令行选项,不带任何空白。/CS或/CSR可以在命令行中指定。不同之处在于,/CSR以反向顺序提供结果,也称为“小端序”,而/CS以“大端序”提供结果。
在这里插入图片描述
例如:
/CS7:@upfront;0x2000-0x3fff/0x2800-0x29ff/0x3000,0x200

上面的选项使用方法7(第8个)对0x2000-0x3ffff范围内的数据计算校验和。0x2800-0x29ff和0x3000-0x31ff的范围将被排除在校验和计算之外。排除对实际数据没有影响。校验和计算的结果将在文件数据的最开头之前写入(注意:它不会预先写入0x2000,而是写入加载文件的最开头。这适用于所有其他标记地址说明符,如’ upfront ', ’ begin ‘和’ append ')。

这篇关于汽车电子 -- Bin、Hex、Srec、s19等文件的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809672

相关文章

结构体和联合体的区别及说明

《结构体和联合体的区别及说明》文章主要介绍了C语言中的结构体和联合体,结构体是一种自定义的复合数据类型,可以包含多个成员,每个成员可以是不同的数据类型,联合体是一种特殊的数据结构,可以在内存中共享同一... 目录结构体和联合体的区别1. 结构体(Struct)2. 联合体(Union)3. 联合体与结构体的

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

python中json.dumps和json.dump区别

《python中json.dumps和json.dump区别》json.dumps将Python对象序列化为JSON字符串,json.dump直接将Python对象序列化写入文件,本文就来介绍一下两个... 目录1、json.dumps和json.dump的区别2、使用 json.dumps() 然后写入文

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们