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

案例背景(共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”文件。

结尾

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

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

v0.8.0: 去掉“直接Hex文件编辑”功能的128K字节限制(其他功能仍然有128KB限制) v0.7.0: 一些小的调整 V0.6.1: 调整另存对话框,去掉无效选项 V0.6.0: 加入文件拖放功能。 V0.5.5:修正建立新的配置文件时,保存失败的Bug。 V0.5.4:修正数制计算器中输入A-F时的bug,增加源数据存储类型选择。 0.5.3:修改图标,部分界面。 0.5.2: About 界面修改,添加更新网址。 0.5.1:修正块另存时新建文件保存失败的Bug。 0.5:新增文件内、文件间块移动、复制、交换、另存等功能 0.4:新增转换为二进制后比较功能 本人继MCUTool以后的另外一个单片机开发实用工具软件,用于单片机调试过程中简单的参量修改,省略修改源代码、再编译的过程,直接修改目标文件。尤其是对eeprom数据的修改、调整更为方便实用。 本软件编写的目的是用来编辑存放于单片机 Flash 或 EEPROM 中的数据,支持 Intel Hex 格式以及 Motorola S 格式的数据文件,也可以编辑二进制的内存映射文件。数据的编辑可以通过常量定义的方式,也可以通过内存映射的方式进行。 同时可以在两种16进制格式文件之间相互转换。格式转换以行数据为单位,以确保转换前后数据不会改变。 另外提供十进制、十六进制转换器,转换结果可以作为普通显示或作为内存映射,作内存映射时可以选择多字节数据的存储方式。 二进制比较功能,通过不同工具生成的Hex文件可能因为格式而无法进行文本方式比较,本工具可以首先转换为二进制数据再进行比较,免去自行转换的麻烦。 单文件内/双文件间的块操作,包括复制、移动、交换、另存等等,方便实验数据提取、复制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车电子助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值