代码:
dest EQU 0x40000000
AREA name, CODE, READONLY
ENTRY
MOV r0, #2
LDR r1, =dest
STR r0, [r1]
stop B stop
END此代码将值2写入内存位置0x40000000。当我将其更改为0x20000000时,2无法写入其中。0x3FFFFFFF也是如此。当我将内存位置设置为0x40003FFF时,2将打印到该位置,但当我将地址更改为0x40004000时,2无法在该位置打印。对于任何更高的地址位置也是如此,如0x50000000。因此,根据这些输出,STR似乎只将值写入到0x40000000和0x40003FFF之间的有限范围的内存中。
有人知道为什么会这样吗?或者是我的代码出了什么问题?我使用的是恩智浦LPC2140的Keil uVision5。
发布于 2019-03-29 05:35:45
我找不到"LPC2140“的数据表,但我找到了似乎是一系列设备的数据表,并且您拥有的具体设备可能是LPC2142/2144。第6.4节的datasheet显示静态随机存取存储器映射到0x40000000-0x40003FFF (假设您已经说过您有16 kB的静态随机存取存储器变体)。这是您应该将其视为通用RAM的唯一地址空间。根据数据表,超出这个范围的一切看起来都很可怕,除非你完全知道你在做什么,否则你应该避免它。
还有一件事你也应该知道,那就是unaligned access。STR一次写入一个完整的字(4字节),因此地址应该在字边界上对齐。0x40003FFF不与4字节边界对齐;您应该改为写入0x40003FFC。如果您只想向0x40003FFF写入一个字节,则应该使用STRB。
https://stackoverflow.com/questions/55330044
复制相似问题