scfor 发表于 2011-9-16 15:45:06

问个32位ARM地址的常识问题

如果RAM区 从0x10000000-0x10001fff ,那么我可以直接访问的地址是不是必须是4的倍数,像0x10000004、0x10000008、0x1000000C、0x10000010等等,还有
0x10000001、0x10000002、0x10000003这些地址能访问么 ?

lileistone 发表于 2011-9-16 15:56:06

对于char型,都能

对于short或者long型,如果是ARMv6架构以上(比如ARM11,ARM Cortex系列),那么即使变量处在非对齐地址上,也可以单个访问。老的ARM 架构(v5及以下)应该是不行。

scfor 发表于 2011-9-16 16:05:50

我用的LPC1752Cortex-M3系列
看这几条指令:
SENTEN      EQU   0x10000004
...
LDRR0, =SENTEN
MOVR1, #0x02
STRR1,
那我可不可以写这样的指令:
SENTEN      EQU   0x10000001
...
LDRR0, =SENTEN
MOVR1, #0x02
STRR1,
或者
SENTEN      EQU   0x10000002
...
LDRR0, =SENTEN
MOVR1, #0x02
STRR1,

ffbiao 发表于 2011-9-16 16:46:04

回复【2楼】scfor
-----------------------------------------------------------------------

仿真一下就知道啦,应该和2楼说的是对的

scfor 发表于 2011-9-16 16:59:53

关键是手头上没仿真器啊 你看看我上面写的几条指令有什么问题没有?

lileistone 发表于 2011-9-16 17:44:38

回复【2楼】scfor
-----------------------------------------------------------------------

可以的。

如果我没看错的话,这个是相当于用指针间接寻址吧。

#define SENTEN    0x10000001

unsigned long*ptr = (unsigned long *)SENTEN;
*ptr = 0x02;


ARM Cortex-M3我没看,但是M4的文档我看过关于对齐这部分,对于常用的LDR/STR, LDRH/STRH, LDRB/STRB是允许非对齐访问的。
ARM的文档说,这些非对齐访问,会在总线上由硬件逻辑转换为多次对齐的访问,拼接后返还给内核;但是相应地要花费多次总线访问的时间,效率较低;但是总归是允许的。

也有一些指令不允许非对齐访问,但是不太常用,或者可以用其他办法绕开。比如LDRM/STRM(存取多个32位字)、LDRD/STRD(存取64位字),使用这些指令进行间接寻址会产生用法异常。

参考1:ARM Cortex-M4 Generic User Guide
Section 3.3.5 “Address Alignment”, Page 3-17.
点击此处下载 ourdev_676932OL9W6I.pdf(文件大小:1.67M) (原文件名:DUI0553A_Cortex_M4_Generic_User_Guide.pdf)


参考2:Cortex-M4 (Revision r0p0) Technical Reference Manual
Section 2.2.1 “Bus Interfaces”, Page 2-5
点击此处下载 ourdev_676933U479KI.pdf(文件大小:875K) (原文件名:DDI0439B_Cortex_M4_Tech_Ref_Manual_r0p0.pdf)

scfor 发表于 2011-9-16 17:49:54

明白了感谢怎么m4都出来了?
页: [1]
查看完整版本: 问个32位ARM地址的常识问题