【嵌入式烧录/刷写文件】-2.9-Intel Hex文件的地址对齐Address Alignment

news2024/11/24 4:34:00

案例背景(共5页精讲):
对一个Intel Hex文件,进行地址对齐Address Alignment

目录

1 为什么要进行“地址对齐Address Alignment”

1.1 “对齐长度”的选择

2 使用Vector HexView工具对Hex文件进行“地址对齐Address Alignment”

2.1 “自动”完成“地址对齐Address Alignment”

2.2 “手动”完成“地址对齐Address Alignment”

2.3 Command line命令行说明

结尾


优质博文推荐阅读(单击下方链接,即可跳转):

点击返回「《Autosar从入门到精通-实战篇》总目录」

点击返回「《Autosar_BSW高阶配置》总目录」

点击返回《嵌入式硬件/软件开发刷写/烧录文件》专栏

1 为什么要进行“地址对齐Address Alignment”

S19/HEX文件是一种常见的嵌入式设备的可执行代码文件格式,它包含机器代码、数据和调试信息等。其中一个重要的概念就是地址对齐

S19/HEX文件之所以要进行地址对齐,是为了满足某些硬件和软件的要求,以确保程序或数据正确地加载和执行。下面是一些原因:

a)内存对齐要求:某些硬件架构对于特定类型的数据或指令的访问要求地址必须对齐到特定的边界。例如,某些处理器可能要求访问32位整数必须从4字节边界开始,否则可能会导致错误或性能下降。通过地址对齐,可以确保每个数据或指令的起始地址都符合硬件的要求。

b)加载和执行效率:地址对齐可以提高程序的加载和执行效率。当数据或指令按照对齐边界存储时,读取和处理这些数据或指令的速度更快。这是因为硬件可以利用并行处理或更高效的内存读取指令来处理对齐数据。

c)内存管理:地址对齐也有助于更好地管理内存。如果数据或指令不对齐存储,可能会导致内存碎片化,使内存利用率降低。通过强制地址对齐,可以减少内存碎片并更有效地利用可用内存。

d)性能优化:地址对齐有助于提高程序的性能。处理器通常可以更有效地访问对齐的数据,因为它们可以使用较少的指令或更高效的内存访问方式。这可以减少指令的执行时间和内存访问的延迟,从而提高整体性能。

e)数据结构要求:某些数据结构要求其元素在内存中按照对齐方式存储。例如,结构体或数组中的元素可能需要按照特定的对齐规则排列,以确保其成员访问的正确性和性能。

f)与外部设备的兼容性:某些外部设备或接口可能对地址对齐有特定的要求。例如,与外部设备进行数据传输时,设备可能要求数据按照特定的对齐方式发送或接收。如果数据不对齐,可能会导致数据传输错误或设备无法正确解析数据。

S19/HEX文件地址对齐机制的主要优点是:

a)生成兼容目标处理器的标准文件格式。地址对齐可以确保S19/Hex文件中的代码和数据能够被目标处理器正确访问和执行。

b)避免未定义行为。填充可以避免未初始化数据被错误解释执行,保证代码的可靠性。

c)方便调试和烧录。地址连续和对齐的文件格式,有利于调试工具解析和烧录算法处理。

d)提高代码执行效率。对齐通常可以使处理器更高效地访问代码和数据,减少无效的等待周期。

但是, S19/HEX文件地址对齐机制也有一定缺点:

a)生成的文件体积会更大。由于填充零和对齐,文件中会包含一定冗余和无效数据,导致文件体积增大。

b)编译过程更复杂。编译器和链接器需要实现地址的计算和对齐,并在必要时插入填充,这增加了软件的实现难度和编译时间。

c)有时会由于过度对齐导致内存利用率降低。比如短数据被迫填充到4字节,会造成一定浪费。

d)不同的MCU和工具的地址对齐规则不同,这给文件兼容性带来一定难度。

e)固定的对齐规则可能无法适应某些特殊应用场景的需要,如部分MCU只在特定模式下才需要严格对齐。

1.1 “对齐长度”的选择

目标处理器的指令长度和数据宽度:例如,8位处理器通常采用1字节(8 bit)对齐;16位处理器采用2字节(16 bit)对齐;32位处理器采用4字节(32 bit)对齐;如32位ARM要求4字节对齐;8位8051要求1字节对齐…。这些需要看具体的芯片手册。

2 使用Vector HexView工具对Hex文件进行“地址对齐Address Alignment”

2.1 “自动”完成“地址对齐Address Alignment”

基于批处理Bat(如下图中的Align_data_Hex_File.bat)调用HexView工具提供的Command line,通过该脚本来实现Hex文件(Boot+App.hex)的“地址对齐Address Alignment。将该脚本集成开发环境IDE(CodeWarrior,S32K DS,Davinci,EB Tresos,ETAS…)中,即可自动实现。见图1-1。

 图1-1

Boot+App.hex摘录:

:20901F007778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F9091929394959661
:20903F009798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B641
:20905F00B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D621
:20907F00D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F601
:20909F00F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213141516E1
:2090BF001718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F30313233343536C1
:0490DF003738393AAB
:20911E00767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F90919293949581
:20913E00969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B561
:20915E00B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D541
:20917E00D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F521
:20919E00F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F10111213141501
:2091BE00161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435E1
:0391DE00363738E9
:00000001FF

Align_data_Hex_File.bat摘录:

@echo off

Rem Path to the executable exe of the Vector HexView tool on your PC
set "HexViewPath=D:\Align_data_Hex\HexView\hexview.exe"

Rem Input files Input_Hex_File for address alignment
set "Input_Hex_File=D:\Align_data_Hex\Boot+App.hex"

Rem Output file Output_Hex_File after address alignment
set "Output_Hex_File=D:\Align_data_Hex\Boot+App_Output.hex"

Rem Call the command line provided by the HexView tool to implement the address padding of the Hex file.
%HexViewPath% /S %Input_Hex_File% /AD:8 /AF:0xFF /AL /XI -o %Output_Hex_File%

运行该批处理Align_data_Hex_File.bat,即可得到地址对齐Address Alignment后的Boot+App_Output.hex文件(8字节对齐)。

2.2 “手动”完成“地址对齐Address Alignment”

使用Vector Hexview工具打开一个hex文件,在菜单栏中依次选择Edit -- > Data Alignment

在弹出的Align data value对话框中,设置对应的对齐参数;

segment alignment value:表示对齐长度;

Fill character:表示填充字符;

Align size:如果选择,所有块的大小都是给定segment align value段对齐值的倍数。

地址对齐后的效果:

注意:

Align size:如果不选择,仅每个Block的开始进行地址对齐;

2.3 Command line命令行说明

/Ad:xx/Adyy    对齐数据。Xx是用标准C符号指定的,例如0xFF,而yy只是十六进制的数字。格式由分隔符':'或'='来区分。

每个区块的起始地址将被调整为给定参数xx的倍数。如果省略了分隔符':'或'=',参数xx是一个十六进制的数值。如果使用了分隔符,xx的值将以C语言解释,例如,/AD:0xFF与/AD:255或/AD:1111111b相同。这个值只能是一个无符号的char值。

/AL  对齐长度。

这个选项与/AD参数结合使用。它将所有数据块的长度调整为/ADxx选项中给出的参数的倍数。

命令行摘自“ReferenceManual_HexView.pdf”文件。

结尾

获取更多“汽车电子资讯”和“工具链使用”,

请关注CSDN博客“汽车电子助手”,做您的好助手。

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

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

相关文章

【JavaEE】Cookie与Session的前后端交互-表白墙登录设计

【JavaEE】Cookie与Session的前后端交互-表白墙登录设计 文章目录 【JavaEE】Cookie与Session的前后端交互-表白墙登录设计1. Cookie与Session1.1 后端doPost的实现1.1.1 隐藏的全局变量1.1.2 获取请求对应的HttpSession对象1.1.3 约定前后端交互方式1.1.4 验证用户名与密码是否…

你不知道的Bing聊天机器人:7个惊人的用途!

导读:以下是我总结的有用的方法,可以利用AI聊天机器人让您的生活更轻松。 本文字数:1600,阅读时长大约:10分钟 生成式AI工具可以用非常多的方式使你的日常生活更轻松。 AI聊天机器人在编程、写作等方面表现出色&#…

JVM入门:官网了解JVM、Java源文件运行过程、什么是类加载器、Java的类加载机制的三种方式、Tomcat的自定义类加载器

JVM入门:官网了解JVM、Java源文件运行过程、什么是类加载器、Java的类加载机制的三种方式、Tomcat的自定义类加载器 通过官网了解JVM官网jdk8结构图什么是JVM查看官网Java语言和虚拟机规范 Java源文件运行过程1.Java源文件经过Javac编译成字节码文件如何手动编译一个…

Java如何实现去重?这是在炫技吗?

大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。austin支持两种去重的类型:N分钟相同内容达到N次去重和一天内N次相同渠道频次去重。 Java开源项目消息推送平台🔥推送…

高性能服务器为什么需要内存池?

C/C程序为什么比起其它语言开发的程序效率要高,一个很重要的原因就是可以直接操作内存,今天就来讲讲为什么需要内存池的技术。 从一个示例开始 先看下面两段代码,都是去重复的创建和删除对象0x5FFFFF次,他们的执行后的效率怎么样…

DIP第7章知识点

文章目录 7.3 相关7.5 基图像7.6 傅里叶相关变换7.6.1 离散哈特利变换7.6.3 离散正弦变换 DIP的其他章节都好复习,唯独就这个第7章小波变换。复习起来十分头大,所以我开始写他的课后题,雾。 7.3 相关 已知两个连续函数 f ( x ) f(x) f(x) …

一篇博客教会你怎么使用Docker安装Redis

文章目录 1、搜索镜像2、拉取镜像3、下载配置文件4、修改配置文件5、启动容器 今天我们学习使用 Docker 安装 Redis。 1、搜索镜像 docker search redis2、拉取镜像 docker pull redis3、下载配置文件 wget http://download.redis.io/redis-stable/redis.conf下载的配置文件…

云原生Docker容器管理

docker容器相当于一个进程,性能接近于原生,几乎没有损耗; docker容器在单台主机上支持的数量成百上千; 容器与容器之间相互隔离; 镜像是创建容器的基础,可以理解镜像为一个压缩包 docker容器的管理 容器…

彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法

原本这篇文章是打算叫「假如我是彩票系统开发者」,但细想一下,如果在文章中引用太多的 JavaScript 的话,反而不是那么纯粹,毕竟也只是我的一厢情愿,彩票开发也不全如本文所讲,有所误导的话便也是得不偿失了…

理解 Java 关键字 final

原文链接 理解 Java 关键字 final final可以用来干什么 final是Java中非常常见的一个关键字,可以说每天都在使用它,虽然常见,但却也不见得都那么显而易见,今天就来研究一下final,以加深对它的理解和更合理的运用。 修…

gitstack使用教程

一、下载及安装 下载地址:https://gitstack.com/download/?spma2c4e.10696291.0.0.6d4c19a40qOauc 支持操作系统列表 本文基于2.3.12版本 下载完成后安装,默认安装路径为:c:\GitStack,安装过程中,gitstack服务会启…

医学图像分割 nnUNetV2 分割自定义2d数据集

文章目录 1 环境安装(Pytorch)1.1 安装conda1.1 安装pytorch1.3 安装nnUNet1.4 安装隐藏层(可选) 2 配置自定义数据集2.1 数据集格式2.2 创建需要目录2.3 数据格式转换2.3.1 修改路径与数据集名称2.3.2 修改训练集与测试集2.3.3 修改掩码所在的文件夹&am…

python基础----05-----函数的多返回值、函数的多种参数使用形式、函数作为参数传递、lambda匿名函数

一 函数的多返回值 if __name__ __main__:# 演示使用多个变量,接收多个返回值def test_return ():return 1,hello,Truex,y,z test_return()print(x)print(y)print(z)1helloTrue二 函数的多种参数使用形式 分为以下四种。 2.1 位置参数 位置参数调用函数时根据…

卡尔曼滤波与组合导航原理(五)序贯Kalman滤波

量测维数很高,而且能写成很多分量,每一个分量可以看成一个小量测,可以序贯进行量测更新 优点是:计算快,数字稳定性更好,我们知道矩阵求逆是和维数的三次方成正比,分成小矩阵求逆快(都…

自学大语言模型之Bert和GPT的区别

Bert和GPT的区别 起源 2018 年,Google 首次推出 BERT(Bidirectional Encoder Representations from Transformers)。该模型是在大量文本语料库上结合无监督和监督学习进行训练的。 BERT 的目标是创建一种语言模型,可以理解句子中…

(Day1)配置云开发提供的模板

创建云开发项目 打开微信开发者工具;点击“项目”->“新建项目”;输入项目名称和选择项目所要保存的目录;输入自己的AppID; AppID的获取,需要登陆微信公众平台,并点击“开发管理”->"开发设置…

凸优化系列——凸函数

1.凸函数的定义 凸函数直观上来说,就是两点之间的函数值小于两点连线的函数值 常见凸函数 线性函数既是凸函数,也是凹函数 对于二次函数,如果Q矩阵是半正定矩阵,那么它的二阶导为Q为半正定矩阵,根据凸性判定的二阶条…

SpringCloud微服务架构 --- 高级篇

一、初识Sentinel 1.1、雪崩问题及解决方案 1.1.1、雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。 1.1.2、解决雪崩问题的常见方式有四种 1.1.2.1、超时处理 设定超时时间,请求超过一定时间…

Swagger原理

最近在基于Swagger进行二次开发, 来对项目的接口进行管理,功能实现了,但是不清楚swagger的工作原理,为了后续能更好利用Swagger来管理接口,而且能借鉴Swagger的原理,将项目中其他信息可视化展示&#xff0c…

什么是测试驱动开发?测试驱动开发有什么优点?

目录 前言 什么是TDD或测试驱动开发? 什么是软件单元测试? 什么是TDD? 测试驱动开发的好处 最后的想法 前言 测试是任何软件开发项目中最重要的步骤之一。如果跳过此过程,则结果可能是灾难性的-对项目和公司而言。但是什么时…