当前位置: 首页 > news >正文

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格式,高字节放内存中高地址位置,低字节放内存中高地址位置。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 详细介绍 Redis 列表的应用场景
  • Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
  • xml重点笔记(尚学堂 3h)
  • zookeeper向管控平台上报状态
  • java序列化对象后读取数据错误的问题
  • 前端大模型入门:掌握langchain的核心Runnable接口(一)
  • Redis---卸载Redis
  • LeetCode 876
  • Window Server 2019+ 安装 Docker
  • 【系统架构设计师-2014年真题】案例分析-答案及详解
  • muduo - 概要简述
  • 不抬头看路会回归那世
  • 数据结构-3.2.栈的顺序存储实现
  • 基于Python的自然语言处理系列(14):TorchText + biGRU + Attention + Teacher Forcing
  • 深入理解Go语言的方法定义与使用
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • ➹使用webpack配置多页面应用(MPA)
  • Java知识点总结(JavaIO-打印流)
  • learning koa2.x
  • Linux CTF 逆向入门
  • MySQL-事务管理(基础)
  • spring学习第二天
  • Vue实战(四)登录/注册页的实现
  • 百度地图API标注+时间轴组件
  • 创建一种深思熟虑的文化
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 开源地图数据可视化库——mapnik
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用docker-compose进行多节点部署
  • Mac 上flink的安装与启动
  • 阿里云ACE认证学习知识点梳理
  • ​香农与信息论三大定律
  • #100天计划# 2013年9月29日
  • #pragma once与条件编译
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (5)STL算法之复制
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Forward) Music Player: From UI Proposal to Code
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (回溯) LeetCode 78. 子集
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (南京观海微电子)——COF介绍
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)3D模板阴影原理
  • .NET Core引入性能分析引导优化
  • .NET 解决重复提交问题
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET连接MongoDB数据库实例教程
  • .NET应用架构设计:原则、模式与实践 目录预览
  • /bin、/sbin、/usr/bin、/usr/sbin