CAPL_构建基于UDS的刷写学习—01 Hex文件的解析

前言:

打算写一个系列:CAPL_构建基于UDS的刷写学习,大致写一下写作的思路

1:本文是第1篇首先讲解基础。首先搞清楚,各种不同文件(常见的S19,hex,bin,以及汽车行业主机厂自己的各种文件CBF(奇瑞特有),VBF(VOLOVL))的格式,以及文件的结构。

2:第二阶段详细简绍CAPL中各种解析文件的函数,以及各种数据转换格式的函数。

3:讲解清楚UDS中0x34,0x35,0x36,0x37等各种服务

4:最后做一个总结,写出一个适合项目应用的CAPL刷写文件。

1:什么是HEX文件?

用处:嵌入式系统中常见的一种文件,通过烧录器写入CPU的flash存储器中的一种文件

起源:Hex文件是Intel公司提出

文件性质的基本定义:是一种按地址排列的数据信息格式。并且以ASCII码的形式,按行记录数据

2:理解HEX文件的构成

首先打开一个Hex文件,可以看到Hex文件是以行为排列的,我们把每一行又可以分为5个部分

如下图:

注意两点:**1)Hex文件不要以HexView软件来打开,要以txt文本形式打开

                **2)为了方便观看,使用空格键,隔开了各个不同的数据段,实际文件打开时,数据中间是不存在空格的,需要注意

Hex文件的格式说明
部分解释按上图说明性质
1

表示第4部分数据的长度

如:上图中第1行蓝色部分字节的长度=4个ASCIL码的字符.故用02表示

第2行蓝色部分=20个ASCIL码的字符.故用0x20表示

位置:固定在开头

长度:固定为2个ASCIL字符

2地址信息表示数据记录的地址,根据类型不同有可能是基地址、段地址或偏移地址

位置:固定在数据长度之后

长度:固定为4个ASCIL字符

3地址类型这个比较复杂,后文单独解释

位置固定

长度:固定为2个ASCIL字符

4数据段字节顺序根据芯片大小端和字长决定

位置固定在地址类型后

长度:不固定

5校验和除冒号和自身以外的其他字节数据加起来模除256的余数的补码

位置:固定在数据段结束之后

长度:固定为2个ASCIL字符

3:部分单独讲解“地址类型”:可以根据数值不同分为以下几类

  • '00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
  • '01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
  • '02' Extended Segment Address Record: 用来标识扩展段地址的记录
  • '03' Start Segment Address Record: 段地址 STM32不用
  • '04' Extended Linear Address Record: 用来标识扩展线性地址
  • '05' Start Linear Address Record: 程序启动运行的地址

如果暂时看不懂,也没关系,但是也需要强制记忆,后续会结合实例来讲解,地址类型是非常重要的一种重要的类型。不同的地址类型,数据的组成也是不一样的。

3:理解地址的重要性

3.1 什么是烧录的目标地址

对于我们很多初学者,需要理解地址的00-05拢共6种类型,和基地址,偏倚地址,段地址的各种复杂的概念。

其实首先要了解的是,这些概念都是为了一个目的,就是能将数据成功的写入flash中的固定地址中去。首先我们来了解一下单片机flash(也就是ROM代码存放的区域)的基础知识。

假设一个芯片内置的Flash ROM=20KB,  ==20,480个Byte,要准确寻址到每一个字节,就需要地址至少16bit长度的地址。

3.2 烧写时,数据是按照连续一段连续写入的

这句话的意思是,Hex数据在写入时,会一段一段的成片写入,而不是一个Byte一个Byte的依次写入,因为烧写也是需要讲究效率的

4:大致了解下,基地址,段地址和偏移地址

4.1 :基地址(Base Address)

基地址,可以暂时记为基本地址,基地址是占据地址位高Byte中的

4.2:段地址(Segment Adress)

段地址是指:Hex会将整体分为若干个段,确切的说是将基地址包含的范围分为若干个段(segment)

4.3:偏移地址 (Offset Adress)

即是指段内地址再细分

5:从实例出发,理解地址信息是如何在Hex文件中表示的

有了以上基础我们再来看

 实例1:02 0000 04 0800 F2 <------- 首行给出烧录的目标地址的高16位 : 0x0800,给出地址类型为0x04(拓展线性地址标识)

看标准规范中对,RecTYP:0x04的解释

04的出现表示了,地址为32bit 

名称:拓展线性地址记录  (32bit格式专属),这里的32bit是指32位的单片机系统。

RecordMark 就是=每一行开头的“:

RecLen 是指数据段的长度,长度固定1byte,值固定为02

LoadOFFSET:是指载入地址偏移,在地址记录=0x04时,值只能=0000

ULBA: 这才是重点,首行给出烧录的目标地址的高16位

实例2:10 0000 00 00F000204501000839FE00088D800008 3E <------- 烧写到0x0800 0000 处的数据

RecTYP:00的解释

就是代表,DATA是需要被写入到ROM中的数据,Load0FFset就称为偏移地址,单烧写器的程序读取到这行时,表达的意思是将“00F000204501000839FE00088D800008”写入到地址为0x0800 0000中去。

实例3:10 0010 00 19F20008B714000811A4010800000000 3C <------- 烧写到0x0800 0010 处的数据

此行解读,和上一行解读相同,重点关注0010的偏移地址,与第一行的目标地址比较一下,可以知道正好相减=10。这就说明了写入数据的第一段和第二段,在内存上是连续的。记住这个概念,对我们后续烧写代码的开发,会有作用。

  • 其他实例:05代表程序入口地址,其数据域的内容在本例中为0x08024433,该地址通常为MCU的复位向量地址,该地址在编译时由工程的链接脚本决定。
  • 04 0000 05 08024433 DD <------- 05类型的行对于烧写程序无用。见参看英文

其他实例:*记录类型:0x03,起始段地址标识

:0200000312FFBD                起始段地址标识:0x12FF

记录类型:0x02,扩展段地址标识

6:地址标识信息 和基地址,段地址,和偏移地址之间的关系

地址标识类型  0x04 =基地址

地址标识类型  0x02=段地址

地址标识类型  0x00=偏移地址

 一旦出现段地址或者线性地址,之后所有数据都要加偏移地址,直到出现一个新的段地址或者线性地址,再重新变更偏移地址。数据物理地址为:线性地址左移16位+段地址左移4位+偏移地址。   

地址计算示例:

:020000040108EA                   线性偏移地址:0x0108

:0200000212FFBD                  扩展段地址:0x12FF

:0401000090FFAA5502          数据地址:0x0100

基地址:0108左移16位,0x01080000;
扩展段地址:12FF左移4位,0x00012FF0;
数据偏移地址:0x0100;
实际物理地址=基地址+扩展段地址+偏移地址=0x010930F0。

7:数据中的大端表示和小端表示

即地址标识信息为0x00时,数据放入内存中的顺序是怎么样的?要理解这个概念首先要明白两个概念:如下

1*)数据中哪里是高位,哪里是低位

还是以上面例子0401000090FFAA5502,红色加粗为数据段,和我们日常写数字的规则一致,左边为高位,依次降低,最右边为最低位。

2*)内存中存放方式:(大端+小端)

大端即motorala格式,高字节放内存中低地址位置,低字节放内存中高地址位置。

小端即intel格式,高字节放内存中高地址位置,低字节放内存中高地址位置。

大端存放方式如下图,小端则将数据倒转过来即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1534487.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

FTP传输太不靠谱了,怎么去找替代FTP软件呢?

在当今这个数据驱动的时代&#xff0c;企业对于文件传输的需求日益增长&#xff0c;而传统的FTP协议由于其在安全性、传输效率、管理便利性等方面的局限性&#xff0c;已经无法满足现代企业的需求。因此&#xff0c;寻找一种可靠的FTP替代方案成为了企业亟待解决的问题。 FTP的…

HRSC2016绘制Ground Truth

利用DOTA的脚本绘制HRSC数据集的真实框&#xff0c;首先将HRSC的标注文件转换为DOTA格式&#xff0c;然后利用DOTA的脚本绘制目标框 新建文件 进入到HRSC2016的Test目录&#xff0c;新建两个文件夹&#xff1a; mkdir DOTA_labels DOTA_labels_drawed新建3个py文件 dota_ut…

【TabBar嵌套Navigation案例-cell重用 Objective-C语言】

一、我们来说这个cell重用(重复使用)的问题啊 1.我们这个比分直播推送页面, 这个里边呢,现在这个cell,涉及到两个样式,上面呢,是Default的,下面呢,是Value1的,然后,我们在这个里边啊,我们每一组就一个cell啊,然后呢,我把这个组,多给它复制几份儿,现在是三个组…

Linux-Makefile的编写、以及编写第一个Linux程序:进度条(模拟方便下载的同时,更新图形化界面)

目录 一、Linux项目自动化构建工具-make/Makefile ​编辑 背景&#xff1a; makefile小技巧&#xff1a; 二、Linux第一个小程序&#xff0d;进度条 先导&#xff1a; 1.如何利用/r,fflush(stdout)来实现我们想要的效果&#xff1b; 2.写一个倒计时&#xff1a; 进度条…

恭喜!龙蜥社区2024年中三大奖项评选名单新鲜出炉

近日&#xff0c;在 2024 龙蜥操作系统大会上&#xff0c;龙蜥社区公布了 2024 年中三大奖项评选名单——“最佳合作伙伴奖”“最佳用户案例奖”“最佳应用实践奖&#xff08;个人&#xff09;”&#xff0c;并邀请清华大学计算机系教授、龙蜥社区高级顾问史元春&#xff0c;海…

地市专利申请及授权数据集合(2000-2023年)xlsx+dta格式

包括发明专利、实用新型、外观专利的申请和授权等。专利作为衡量一个地区科技创新能力和水平的重要指标&#xff0c;不仅反映了地方企业在技术研发、产品创新方面的活跃程度&#xff0c;也是推动产业升级、促进经济高质量发展的关键力量 一、数据介绍 数据名称&#xff1a;地…

ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法

ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法 现象解决办法 现象 在命令行中&#xff0c;可以正常导入_ssl模块&#xff0c;如下&#xff1a; Python 3.9.0 (default, Nov 15 2020, 08:30:55) [MSC v.1916 64 bit (AMD64)] :: Anaconda, …

落地扶持丨云微客山西临汾落地会销圆满收官

2024年9月6日&#xff0c;云微客落地扶持走进山西临汾红星美凯龙《助力家居行业营销数智化研讨会》&#xff0c;活动吸引了近百家家居品牌商户的参与&#xff0c;现场气氛热烈&#xff0c;签约不断&#xff0c;为当地家居行业打开短视频矩阵营销新思路。 短视频成为全行业必争…

界面控件DevExpress中文教程:如何PDF图形对象的可见性?

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 近期重要版本v24.1已正式发布&#xff0c;该版本拥有众多新产…

单机快速部署开源、免费的分布式任务调度系统——Apache DolphinScheduler

本文主要为大家介绍Apache DolphinScheduler的单机部署方式&#xff0c;方便大家快速体验。 环境准备 需要Java环境&#xff0c;这是一个老生常谈的问题&#xff0c;关于Java环境的安装与配置期望大家都可以熟练掌握。 验证java环境 java -version 下载安装包并解压 使用wg…

现代 Web 开发工具箱:Element-UI 表单组件全攻略(一)

现代 Web 开发工具箱&#xff1a;Element-UI 表单组件全攻略&#xff08;一&#xff09; 一 . Radio 单选框1.1 创建 Radio 按钮① 注册路由② 创建 radio 组件 1.2 Radio 的相关属性① 是否禁用② 是否显示边框③ 原生 name 属性④ 按钮的样式 1.3 Radio 相关事件1.4 Radio 按…

从 TF卡升级 f1c100s spinand

开发GUI 便宜好用的ARM 不多见了&#xff0c;f1c100s 作为首选&#xff0c;搜索相关spinand 启动支持 的uboot 帖子大多相当久远&#xff0c;随着uboot的升级 已经支持spinand 启动&#xff0c;但是spl 部分支持任然需要查询相关资料才行&#xff1b; 参考该博主文章&#xff…

Kubernetes从零到精通(07-工作负载-StatefulSet)

StatefulSet示例 正如Deployment管理无状态应用程序的资源&#xff0c;StatefulSet用来管理有状态应用程序&#xff08;如kafka、redis、zookeeper集群等&#xff09;的资源&#xff0c;它为每个 Pod 分配一个固定的名称和存储&#xff0c;以确保它们可以保留状态&#xff0c;无…

PHP仓库物资出入库管理系统小程序源码

仓库物资出入库管理系统&#xff1a;让库存管理变得井井有条 **&#x1f4e6; 开篇&#xff1a;告别混乱&#xff0c;拥抱智能库存时代 还在为仓库里堆积如山的物资和繁琐的出入库记录而头疼吗&#xff1f;是时候告别那些混乱的日子了&#xff01;“仓库物资出入库管理系统”应…

Redis的持久化和高可用性

目录 一、淘汰策略 1、背景 2、淘汰策略 二、持久化 1、背景 2、fork进程写时复制机制 3、Redis持久化方式 1、aof 2、rdb 三、高可用 1、主从复制 2、Redis哨兵模式 3、Redis cluster集群 一、淘汰策略 1、背景 首先Redis是一个内存数据库&#xff0c;将所有数…

【Python机器学习】序列到序列建模和注意力机制——编码-解码架构

LSTM非常擅长处理序列&#xff0c;但我们需要一对而不是一个LSTM。我们将构建一个模块化的架构&#xff0c;称为编码-解码架构。 编码-解码架构的前半部分是序列编码器&#xff0c;该网络将序列&#xff08;如自然语言文本&#xff09;转换为较低维的表示形式&#xff08;如思…

重生奇迹MU 红龙剑士的风采 游戏玩家的记忆

在重生奇迹MU游戏中&#xff0c;剑士是一个老牌职业&#xff0c;而其中红龙剑士更是备受瞩目的角色。红龙剑士选手身着一身红色龙王装&#xff0c;仿佛已经沐浴了敌人的鲜血&#xff0c;是一个经验丰富的剑手。很多老玩家都信任剑士这个职业&#xff0c;并视其为忠实的伙伴&…

[每周一更]-(第114期):介绍GitLab不同角色对应的权限

文章目录 GitLab 角色及其权限项目级别角色组级别角色 使用场景示例 工作中一直使用Gitlab搭建了公司内网的代码管理工具&#xff0c;但是不同的用户会分配相应的权限&#xff0c;来管理不同用户及角色的权限信息&#xff0c;我们来介绍下角色的信息&#xff0c;方便我们管理公…

C++教程(一):超详细的C++矩阵操作和运算(附实例代码,与python对比)

python教程&#xff08;一&#xff09;&#xff1a;超详细的numpy矩阵操作和运算&#xff08;附实例代码&#xff09; 在之前的章节中&#xff0c;我们详细介绍了python中numpy的矩阵操作。但在自动驾驶开发中&#xff0c;我们一般采用C进行功能开发&#xff0c;因此C矩阵运算…

重学SpringBoot3-集成RocketMQ(二)

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成RocketMQ&#xff08;二&#xff09; 1. 基础概念2. 准备工作3. 实现事务消息的生产者4. 事务监听器实现5. 消费者示例6. 发送事务消息7. 测试7.1 模…