0

代码:

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 之间的有限内存范围。

有谁知道为什么会这样?还是我的代码有问题?我正在使用 Keil uVision5、NXP LPC2140。

4

1 回答 1

2

我找不到“LPC2140”的数据表,但我找到了似乎是一系列设备的数据表,而您拥有的特定设备可能是 LPC2142/2144。数据表第6.4 节显示 SRAM 已映射到0x40000000-0x40003FFF(假设您所说的有 16 kB SRAM 变体)。这是您应该将其视为通用 RAM 的唯一地址空间。根据数据表,超出该范围的所有内容看起来都很可怕,除非您完全知道自己在做什么,否则您应该避免使用它。

您还应该意识到的一件事是未对齐访问STR一次写入一个完整的字(4 个字节),因此地址应该在字边界上对齐。0x40003FFF未与 4 字节边界对齐;你应该写信给0x40003FFC。如果您只想将单个字节写入0x40003FFF,则应该STRB改用。

于 2019-03-28T21:35:45.267 回答