嵌入式学习之HEX转BIN文件
ztj100 2024-11-24 01:32 12 浏览 0 评论
发布了关于bootloader的文章之后,收到了很多讨论,今天笔者再和大家聊聊关于烧录文件的知识。由于机器只识别二进制文件,所以我们通过编译器如CCS,IAR,KEIL,MALAB等等将C语言或汇编语言编写的程序转换为HEX或BIN文件,然后下载到芯片中,这样芯片就能正常运转了。
HEX和BIN文件的区别
HEX文件:ASCII码文件,包含了升级文件的地址和校验信息;地址不连续;
BIN文件:十六进制文件,只包含升级数据文件;地址连续;
占用内存:HEX文件 > BIN文件;
升级时间:HEX文件 < BIN文件;(HEX文件升级时间不固定,跟着文件大小改变;BIN文件升级时间固定)
因为文件地址可以跳跃,理论上升级HEX文件比升级BIN文件耗时最短,效率更高;但是实际情况却恰恰相反。
由于HEX文件是ASCII码,所以需要上位机或主机把HEX文件转成机器可识别的二进制,再根据地址写进去;且实际应用发现,有些芯片跳跃地址写数据会失败,所以还是需要连续地址写入。因此需要上位机或主机需要将HEX文件转BIN文件,再通过连续地址将文件写入。
笔者推荐大家通过编译器直接生成BIN文件,不仅代码更精简,逻辑也更简单。
推荐大家看TI或ST的IAP程序,官方例程都是生成的BIN文件。
那么HEX文件如何转成BIN文件呢,接下来我们一起聊一聊。
HEX数据格式
:08007000760076130048C01B66 // 随机截取一段HEX文件
<0x3a> | :(冒号) |
[数据长度1byte] | 08(十六进制) |
[数据地址2byte] | 00 70(偏移地址) |
[数据类型1byte] | 00:数据 01:文件结束 04:基地址 |
[数据nByte] | 760076130048C01B |
[校验1Byte] | 66 |
<0x0d> | |
<0x0a> |
校验和的算法为:计算从0x3A 以后(不包括0x3A)的所有各字节的和模256的余。即各字节二进制算术和,不计超过256的溢出值,然后用0x100减去这个算数累加和,得出得值就是此行得校验和
校验 = 0xff & (0x100 –(0x08+0x00+0x70+0x00+0x76+0x00+0x76+0x13+0x00+0x48+0xC0+0x1B)= 0x66
HEX文件解析要求
1、 需要区分基地址和偏移地址,地址为 基地址<<4+偏移地址
2、 中间跳跃的地址需要补0xff
3、 文件结束要注意,不能漏掉一两字节
hex转BIN文件步骤
读一行数据,校验此行的数据格式是否正确(冒号,校验和,换行符);
错误,提示“转换失败,第x行校验失败”。
正确,读取第4个字节,
值为0x01,表示文件结束,提示“文件转换完成”
值为0x04,更新基地址为 BaseAddress = data<<16
值为0x00,记录地址 Address = BaseAddress+data,数据长度len;数据data
hex转BIN文件举例
第一行::020000040008F2 ->基地址 0x0008
第二行::0400000000498BB078 ->数据 地址为 0x00080000,BIN文件为00498BB0
地址 = 0x00080000
BIN文件为 00498BB0;
预测地址 = 地址+长度/2 = 0x00080000+0x04/2 = 0x00080002
第三行::02000200AAAAA8 ->数据 地址为 0x00080002,数据为AAAA
地址=0x00080002=预测地址,不需要补数据
BIN文件为00 49 8B B0 AA AA
预测地址=0x00080002+0x02/2=0x00080003
第四行::200010008D007029762228C00068761A9A00D50028A403FFF7A496858F40040028A403FF9E->数据 地址为 0x00080010,数据为8D007029762228C00068761A9A00D50028A403FFF7A496858F40040028A403FF
地址=0x00080010>预测地址,BIN文件需要补FF,需要补个数=(地址-预测地址)*2=26,
BIN文件为00 49 8B B0 AA AA FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 8D 00 70 29 76 22 28 C0 00 68 76 1A 9A 00 D5 00 28 A4 03 FF F7 A4 96 85 8F 40 04 00 28 A4 03 FF
预测地址=0x00080010+0x20/2 = 0x00080020
第五行::20002000F7A496858F40800028A40FFFF7A496858F40900028A40FFFF7A496858F40A000CD->数据 地址为 0x00080020,数据为F7A496858F40800028A40FFFF7A496858F40900028A40FFFF7A496858F40A000
地址=0x00080020=预测地址, 不需要补FF;
BIN文件为00 49 8B B0 AA AA FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 8D 00 70 29 76 22 28 C0 00 68 76 1A 9A 00 D5 00 28 A4 03 FF F7 A4 96 85 8F 40 04 00 28 A4 03 FF F7 A4 96 85 8F 40 80 00 28 A4 0F FF F7 A4 96 85 8F 40 90 00 28 A4 0F FF F7 A4 96 85 8F 40 A0 00
预测地址=0x00080020+0x20/2=0x00080030
结语
以上就是对于HEX和BIN文件区别,以及HEX转BIN文件的方法,看起来还是比较简单的,就是工作量比较大,只要掌握了技巧还是不难。电脑由于内存大,运行速度快,所以没啥压力;如果通过MCU自己去解析就很慢也比较难受。
对于在线升级的应用环境,笔者还是希望大家多多使用BIN文件;TI和ST都提供了非常简单的生成BIN文件的方案,希望大家多多参考。
好了,今天就和大家分享到这里,有什么想说的,一起来评论区聊聊吧!
相关推荐
- 告别手动操作:一键多工作表合并的实用方法
-
通常情况下,我们需要将同一工作簿内不同工作表中的数据进行合并处理。如何快速有效地完成这些数据的整合呢?这主要取决于需要合并的源数据的结构。...
- 【MySQL技术专题】「优化技术系列」常用SQL的优化方案和技术思路
-
概述前面我们介绍了MySQL中怎么样通过索引来优化查询。日常开发中,除了使用查询外,我们还会使用一些其他的常用SQL,比如INSERT、GROUPBY等。对于这些SQL语句,我们该怎么样进行优化呢...
- 9.7寸视网膜屏原道M9i双系统安装教程
-
泡泡网平板电脑频道4月17日原道M9i采用Win8安卓双系统,对于喜欢折腾的朋友来说,刷机成了一件难事,那么原道M9i如何刷机呢?下面通过详细地图文,介绍原道M9i的刷机操作过程,在刷机的过程中,要...
- 如何做好分布式任务调度——Scheduler 的一些探索
-
作者:张宇轩,章逸,曾丹初识Scheduler找准定位:分布式任务调度平台...
- mysqldump备份操作大全及相关参数详解
-
mysqldump简介mysqldump是用于转储MySQL数据库的实用程序,通常我们用来迁移和备份数据库;它自带的功能参数非常多,文中列举出几乎所有常用的导出操作方法,在文章末尾将所有的参数详细说明...
- 大厂面试冲刺,Java“实战”问题三连,你碰到了哪个?
-
推荐学习...
- 亿级分库分表,如何丝滑扩容、如何双写灰度
-
以下是基于亿级分库分表丝滑扩容与双写灰度设计方案,结合架构图与核心流程说明:一、总体设计目标...
- MYSQL表设计规范(mysql表设计原则)
-
日常工作总结,不是通用规范一、表设计库名、表名、字段名必须使用小写字母,“_”分割。...
- 怎么解决MySQL中的Duplicate entry错误?
-
在使用MySQL数据库时,我们经常会遇到Duplicateentry错误,这是由于插入或更新数据时出现了重复的唯一键值。这种错误可能会导致数据的不一致性和完整性问题。为了解决这个问题,我们可以采取以...
- 高并发下如何防重?(高并发如何防止重复)
-
前言最近测试给我提了一个bug,说我之前提供的一个批量复制商品的接口,产生了重复的商品数据。...
- 性能压测数据告诉你MySQL和MariaDB该怎么选
-
1.压测环境为了尽可能的客观公正,本次选择同一物理机上的两台虚拟机,一台用作数据库服务器,一台用作运行压测工具mysqlslap,操作系统均为UbuntuServer22.04LTS。...
- 屠龙之技 --sql注入 不值得浪费超过十天 实战中sqlmap--lv 3通杀全国
-
MySQL小结发表于2020-09-21分类于知识整理阅读次数:本文字数:67k阅读时长≈1:01...
- 破防了,谁懂啊家人们:记一次 mysql 问题排查
-
作者:温粥一、前言谁懂啊家人们,作为一名java开发,原来以为mysql这东西,写写CRUD,不是有手就行吗;你说DDL啊,不就是设计个表结构,搞几个索引吗。...
- MySQL 之 Performance Schema(mysql安装及配置超详细教程)
-
MySQL之PerformanceSchema介绍PerformanceSchema提供了在数据库运行时实时检查MySQL服务器的内部执行情况的方法,通过监视MySQL服务器的事件来实现监视内...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)