HEX格式转BIN格式 MOT格式转BIN格式

背景说明

嵌入式系统软件的特点

现在社会,我们使用的生活电器,设备、各种电子产品一般都运行着嵌入式软件。这些软件和通常计算机上的软件相比,有自己的特点:比如不需要也不能由用户安装、软件的体积相对较小,不是运行在类似如Windows、Linux这些通用的OS上。这些软件和通常的PC不同,也不是放在常见的硬盘中,而是像它的名字一样,嵌入式软件是内嵌到电子产品的内部的。 嵌入式系统内部通常都有一个关键的部件Flash。程序就是保存在这上面。也有些系统,会发现在电路图上找不到这个部件,那么程序保存在那儿?同样是保存Flash上,在那是因为Flash部件也可以集成在MPU(微处理器)内部。 这些产品在生产时,其软件会一次性的写入到Flash中。

典型嵌入式软件的构成

下面的示意图表明了一个典型嵌入式系统的硬件和软件构成:

MCU

Flash (1M)

硬件构成:  

SDRAM

(32M)

      MPU:程序指令运行的地方 Flash:保存程序的地方。 RAM:保存运行中程序以及程序运行时需要使用的变量、堆栈等的地方。 软件构成:
          BOOT区域:这部分的程序主要完成初始化、程序重定向这样的内容。这部分的内容在实际软件开发中通常不会变更。 Application区域:这部分的程序是对应设备机能部分的程序。这部分内容在开发过程中会频繁变更。 设备上电后,通常Boot区域的程序开始运行,完成初始化,并将Application部分的程序从Flash上Copy到RAM中,完成重定向,之后,程序开始在RAM上运行。 由于以上Boot和Application区域程序的特点,通常他们都是分别开发的。

生产线上的要求

嵌入式系统的软件不是由用户安装的,而是在生产时就一次性的将程序写入到Flash中。而Boot和Application部分的程序是分别开发的,这就出现一个需求,如何将Boot区域的程序和Application部分的程序连接起来做成可以一次性写入Flash的文件。这就是这次我们进行的开发工作。

4、程序格式说明

我们知道,Windows上开发的程序通常是.exe/.dll等格式的。而嵌入式开发的时候最后只会生成一个文件,这个文件是所有程序的集成。 通常这样的文件格式是HEX格式或者MOT格式的或者Binary格式的。上述3种格式在嵌入式软件开发过程中广泛使用。 前面提到过,由于Boot和Application部分是分别开发的,那么实际开发时生成的是两部分的软件。这就需要将这两部分的软件连接起来,以便生产线上烧写程序。

课题要求说明:

我们根据实际的开发过程中遇到的要求,希望大家做成一个程序,将开发时分别开发的Boot区域的程序和Application部分的区域连接起来,以便生产线上一次性写入Flash。 考虑到大家初次接触嵌入式系统,所以我们按照具体的功能分解成下面提到的4个详细要求,大家按照顺序进行完成。 1、 Hex/Mot->Bin 嵌入式软件开发时,最终生成的文件通常都是Hex格式或者Mot(S-Record)格式。比如Boot和Application部分的程序都会生成各自的Hex文件或者MOT文件。根据实际情况,有时我们需要将将程序开发时生成的Hex格式或者Mot格式的文件转化成最终用于烧写的Bin文件。 Bin格式就是Binary格式的简写,就是实际的数据内容。 Hex和Mot格式大家参照附录部分进行了解。更多的资料大家可以从c++程序代写上进行查询。  

2、 MapLink 将Boot和Application部分转化的Bin文件按照实际地址连接起来,其中没有数据的部分用0xff补齐。
Boot代码 初始化 代码Copy 重定向 ……  
       
Application代码
+
     
最终的产品代码
        3、 Rom压缩 上述生成的Bin文件中,Application部分实际是在RAM上运行的,只是保存在Flash上。那么如果Application部分的体积很大的话,可以进行压缩,这样可以减少Flash的使用量并有利于程序保密。在需要将Application部分的程序Copy到RAM上时,同时进行解压缩就可以了。 需要注意的是:对于压缩的算法,分为有损压缩和无损压缩。有损压缩通常可以获得一个比较高的压缩率(比如Mp3就是对音频文件的压缩方式,可以获得极高的压缩率),但是解压缩后的内容和原始内容会有差异。对于程序的压缩,必须使用无损压缩这样的方式。 对于具体使用的压缩算法,实际可以使用的算法很多,不限定使用那个算法。需要大家自己查找相关资料进行设计。 4、 界面支持 在完成前述1、2、3机能的基础上,如果时间有剩余的话,可以进行本条内容。 设计一个简单易用的Windows界面,以易于操作。比如:可以选定输入文件和输出文件,使用易用的界面进行参数设定。 5、 提供的文件说明 为完成本课题,分别提供了一些文件,说明如下: Boot.mot/Boot.hex:提供关于Mot格式和Hex格式的范例文件,这两个文件是同一程序的不同表达方式,转化成Bin后应该是完成一样的。使用的是Intel expanded hex format。 Appl.mot/Appl.hex:提供关于Mot格式和Hex格式的范例文件,这两个文件是同一程序的不同表达方式,转化成Bin后应该是完成一样的。使用的是Motorola S Type Format(Standard address)。 boot.bin:上述Boot.mot/Boot.hex转化后的Binary文件,用于大家程序检验使用。 appl.bin:上述Appl.mot/Appl.hex转化后的Binary文件,用于大家程序检验使用。 intelhex.pdf:Intel Hex Format的说明文档,更多更详细的内容请使用BaiduM68000PRM.pdf:Motorola芯片的说明书,附录部分有关于Mot格式的说明。更多更详细的内容请使用Baidu

附录:

Hex格式介绍 什么是Intel HEX文件格式? Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。大多数EPROM编程器或模拟器使用Intel HEX文件。 记录格式 Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列: :llaaaatt[dd...]cc 每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样: : 每个Intel HEX记录都由冒号开头. ll 是数据长度域,它代表记录当中数据字节(dd)的数量. aaaa 是地址域,它代表记录当中数据的起始地址. tt 是代表HEX记录类型的域,它可能是以下数据当中的一个: 00 – 数据记录 01 – 文件结束记录 02 – 扩展段地址记录 04 – 扩展线性地址记录 dd 是数据域,它代表一个字节的数据.一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符. cc 是校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足. 数据记录 Intel HEX文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下: :10246200464C5549442050524F46494C4500464C33 其中: 10 是这个记录当中数据字节的数量. 2462 是数据将被下载到存储器当中的地址. 00 是记录类型(数据记录) 464C…464C是数据. 33 是这个记录的校验和. 扩展线性地址记录(HEX386) 扩展线性地址记录也叫作32位地址记录或HEX386记录.这些记录包含数据地址的高16位.扩展线性地址记录总是有两个数据字节,外观如下: :02000004FFFFFC 其中: 02 是这个记录当中数据字节的数量. 0000 是地址域,对于扩展线性地址记录,这个域总是0000. 04 是记录类型 04(扩展线性地址记录) FFFF 是地址的高16位. FC 是这个记录的校验和,计算方法如下: 01h + NOT(02h + 00h + 00h + 04h + FFh + FFh). 当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.线性地址保持有效,直到它被另外一个扩展地址记录所改变. 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址. 以下的例子演示了这个过程.. 来自数据记录地址域的地址 2462 扩展线性地址记录的数据域  + FFFF 绝对存储器地址        FFFF2462 扩展段地址记录(HEX86) 扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段.扩展段地址记录总是有两个数据字节,外观如下: :020000021200EA 其中: 02 是记录当中数据字节的数量. 0000 是地址域.对于扩展段地址记录,这个域总是0000. 02 是记录类型 02(扩展段地址记录) 1200 是地址段. EA 是这个记录的校验和,计算方法如下: 01h + NOT(02h + 00h + 00h + 02h + 12h + 00h). 当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录.段地址保持有效,直到它被另外一个扩展地址记录所改变. 通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址. 以下的例子演示了这个过程.. 来自数据记录地址域的地址                             2462 扩展段地址记录数据域                      +  1200 绝对存储器地址           00014462 文件结束(EOF)记录 Intel HEX文件必须以文件结束(EOF)记录结束.这个记录的记录类型域的值必须是01.EOF记录外观总是如下: :00000001FF 其中: 00 是记录当中数据字节的数量. 0000 是数据被下载到存储器当中的地址.在文件结束记录当中地址是没有意义被忽略的.0000h是典型的地址. 01 是记录类型 01(文件结束记录) FF 是这个记录的校验和,计算方法如下: 01h + NOT(00h + 00h + 00h + 01h). Intel HEX文件例子: 下面是一个完整的Intel HEX文件的例子: :10001300AC12AD13AE10AF1112002F8E0E8F0F2244 :10000300E50B250DF509E50A350CF5081200132259 :03000000020023D8 :0C002300787FE4F6D8FD7581130200031D :10002F00EFF88DF0A4FFEDC5F0CEA42EFEEC88F016 :04003F00A42EFE22CB :00000001FF   Mot格式介绍   Motorola S-records 16进制文件格式是嵌入式中除intel hex之外很常见的格式,下面是它的格式: +-------------------//------------------//-----------------------+ | type(hex1) | count(hex 1) | address | data | checksum(从count累加到checksum,总和为0xFF) | +-------------------//------------------//-----------------------+ S0 :标识记录,地址域长度为2个字节,并用0000填充,数据区记录了一些模块名称和版本之类的信息 S1 :数据记录,地址域长度为2个字节,数据区域为数据内容。 S2 :数据记录,地址域长度为3个字节,数据区域为数据内容。 S3 :数据记录,地址域长度为4个字节,数据区域为数据内容。 S5 :统计记录,地址域长度为2个字节,内容是之前数据记录(S1,S2,S3)的个数,数据区域空。 S7 :运行记录,地址域长度为4个字节,内容是程序启动的地址,数据域空。 S8 :运行记录,地址域长度为3个字节,内容是程序启动的地址,数据域空。 S9 :运行记录,地址域长度为2个字节,内容是程序启动的地址,数据域空。 下面是一个例子,大家看看: S02B0000433A5C446F63756D656E747320616E642053657474696E67735C7A6F75642E4143434F554E54535C7D S208010000FFFFFFFFFA S30800020000000000F5 S5030002FA S9030000FC 第一行:没什么,开个头而已。 第二行:地址0x10000有4个0xFF 第三行:地址0x20000有3个0x00 第四行:标明之前有两条数据记录 第五行:程序从0x0000地址开始运行 关于checksum的算法 checksum = 0xFF - (从count段开始所有字节的总和)。 无损压缩介绍 所谓无损压缩格式,是利用数据的统计冗余进行压缩,可完全回复原始数据而不引起任何失真,但压缩率是受到数据统计冗余度的理论限制,一般为2:1到5:1.这类方法广泛用于文本数据,程序和特殊应用场合的图像数据的压缩。 由于压缩比的限制,仅使用无损压缩方法是不可能解决图像和数字视频的存储和传输的所有问题.经常使用的无损压缩方法有 Shannon-Fano 编码,Huffman 编码,游程(Run-length)编码,LZW(Lempel-Ziv-Welch)编码和算术编码等。  专业程序代写c++程序代写
原文地址:https://www.cnblogs.com/java20130723/p/3211252.html