1.什么是地址对齐
1、所谓对齐bai就是数据在存du储器中存放的规则,32位系统中一般zhi有字节对齐(dao8bit)、半字对zhuan齐(16bit)、字对齐(32bit)三种方式,分别对齐到连续地址、偶数地址、被4整除的地址。
2、arm体系结构中有ARM指令集和Thumb指令集2种,其中ARM指令为32位指令,按照4字节对齐存储,一条指令必须从4的整数倍地址来取;Thumb指令为16位指令,按2字节对齐存储,一条指令必须从偶数地址来取。
3、数据的存储:字符型数据一般为字节对齐存储、短整型按照双字节对齐存储、整型/浮点型按照4字节对齐存储。
2.为什么要地址对齐
地址对齐其实就是CPU设计中的一个时空权衡,这里采用的是空间换时间的。主要的解决问题是如何能过快速的读取给定的一个变量。
目前的主流计算机有32位,64位这是地址线,一般数据线与地址线条数相同。
如果放置数据时不考虑地址对齐,32位的CPU读取一个4字节的int最少需要一次内存访问,最多需要2次访问内存。下图中左面,取一个int要两次内存访问,而右边的只需要一次内存访问。
3.AXIZ中的地址对齐
在AXI中,主要是三种猝发模式,FIXED,INCR,WRAP。前两种比较容易理解,第三种的边界计算如下。
WRAP猝发类似于INCR猝发。在WRAP中,地址将根据SiZE递增,但是达到地址上限时,地址将换到地址下限。
在WRAP地址计算过程中有两个注意事项,
- 计算WRAP的地址上限
- 低位地址回旋到WRAP
WRAP突发有限制:
- 起始地址必须与每次传输的大小对齐
- 突发长度必须为2、4、8或16个传输
起始地址一定是和size对齐的,比如size是2(每次传输2^2bytes),那么起始地址就不能是0x32,只能是0x34,0x38这些
如果size是3,则是2^3=8bytes=64bits(64的位宽),则地址要是0x30,0x38这些,
计算方式如下:
地址下界:
地址上界:
Ex1:
AxADDR = 0x04, AxLEN = 3, AxSIZE = 2, AxBURST = 3。
Start_Address = 0x04
Burst_Length = 4
Number_Bytes = 2^2=4
因此地址下界
= (0x04/(4x4)) x (4x4)
= 0
地址上界
= 0 + (4 x 4)
= 16
Address_0 = 4
Address_1 = Address_0 + Number_Bytes = 4 + 4 = 8
Address_2 = Address_1 + Number_Bytes = 8 + 4 = 12
Address_3 = Address_2 + Number_Bytes = 12 + 4 = 16
因为上界为16,因此地址Address_3 = 0。
因此地址为4,8,12,0。
Ex2:
AxADDR = 0x38, AxLEN = 3, AxSIZE = 2, AxBURST = 3。
Start_Address = 0x38
Burst_Length = 4
Number_Bytes = 2^2=4
因此地址下界
= (0x38/(4x4)) x (4x4)
= 0x30
地址上界
= 0x30 + (4 x 4)
= 0x40
Address_0 = 0x38
Address_1 = Address_0 + Number_Bytes = 0x38 + 0x4 = 0x3C
Address_2 = Address_1 + Number_Bytes = 0x3C + 0x4 = 0x40
因为Address_2 == 0x40, 达到上边界,因此Address_2 = 0x30
Address_3 = Address_2 + Number_Bytes = 0x30 + 0x4 = 0x34
因此地址为 0x38, 0x3C, 0x30, 0x34。
Ex3:
AxADDR = 0x34, AxLEN = 7, AxSIZE = 2, AxBURST = 3。
Start_Address = 0x34
Burst_Length = 8
Number_Bytes = 2^2=4
因此地址下界
= (0x34/(4x8)) x (4x8)
= 0x20
地址上界
= 0x20 + (4 x 8)
= 0x40
Address_0 = 0x34
Address_1 = Address_0 + Number_Bytes = 0x34 + 4 = 0x38
Address_2 = Address_1 + Number_Bytes = 0x38 + 4 = 0x3C
Address_3 = Address_2 + Number_Bytes = 0x3C + 4 = 0x40
因为Address_3 == 0x40,达到上边界,因此 Address_3 = 0x20
Address_4 = Address_3 + Number_Bytes = 0x20 + 4 = 0x24
Address_5 = Address_4 + Number_Bytes = 0x24 + 4 = 0x28
Address_6 = Address_5 + Number_Bytes = 0x28 + 4 = 0x2C
Address_7 = Address_6 + Number_Bytes = 0x2C + 4 = 0x30
因此地址为 0x34, 0x38, 0x3C, 0x20, 0x24, 0x28, 0x2C, 0x30