地址对齐相关

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地址计算过程中有两个注意事项,

  1. 计算WRAP的地址上限
  2. 低位地址回旋到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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值