目录
1 为什么要进行“地址对齐Address Alignment”
1.1 “对齐长度”的选择
2 使用Vector HexView工具对Hex文件进行“地址对齐Address Alignment”
2.1 “自动”完成“地址对齐Address Alignment”
2.2 “手动”完成“地址对齐Address Alignment”
2.3 Command line命令行说明
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”文件。