为什么 STR 仅适用于 0x40000000 和 0x40003FFF 之间的地址?
Why does STR only work for addresses between 0x40000000 and 0x40003FFF?
代码:
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。
我找不到 "LPC2140" 的数据表,但我找到了一个似乎是一系列设备的数据表,而您拥有的特定设备可能是 LPC2142/2144。 datasheet,第 6.4 节显示 SRAM 映射到 0x40000000-0x40003FFF
(假设您所说的是 16 kB SRAM 变体)。那是您应该将其视为通用 RAM 的唯一地址 space。根据数据表,超出该范围的所有东西看起来都很可怕,除非你完全知道自己在做什么,否则你应该避免它。
您还应该认识到的一件事是 unaligned access。 STR
一次写入一个完整的字(4 个字节),因此地址应在字边界上对齐。 0x40003FFF
未对齐到 4 字节边界;你应该写信给 0x40003FFC
而不是。如果您只想将一个字节写入 0x40003FFF
,则应该使用 STRB
。
代码:
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。
我找不到 "LPC2140" 的数据表,但我找到了一个似乎是一系列设备的数据表,而您拥有的特定设备可能是 LPC2142/2144。 datasheet,第 6.4 节显示 SRAM 映射到 0x40000000-0x40003FFF
(假设您所说的是 16 kB SRAM 变体)。那是您应该将其视为通用 RAM 的唯一地址 space。根据数据表,超出该范围的所有东西看起来都很可怕,除非你完全知道自己在做什么,否则你应该避免它。
您还应该认识到的一件事是 unaligned access。 STR
一次写入一个完整的字(4 个字节),因此地址应在字边界上对齐。 0x40003FFF
未对齐到 4 字节边界;你应该写信给 0x40003FFC
而不是。如果您只想将一个字节写入 0x40003FFF
,则应该使用 STRB
。