我有这个奇怪的问题,MMU为str而不是ldr指令翻译内存。我正在使用gcc(没有优化)为arm7TDMI编译。
程序输入一个函数并在堆栈中存储4个参数(r0到r3) 我有这些寄存器:
r0 = 0x1e10c8
r1 = 0x12adf0
r2 = 0x0
r3 = 0x2
r11 = 0x12ade4
MMU处于活动状态,0x0和0x00FFFFFF之间的所有物理位于0xC0000000和0xC0FFFFFF之间
pc执行这4行汇编:
str r0, [r11, #-24]
str r1, [r11, #-28]
str r2, [r11, #-32]
strb r3, [r11, #-33]
这是内存范围,执行后存储数据:
0xC012ADC0 02000000 ....
0xC012ADC4 00000000 ....
0xC012ADC8 0012ADF0 ð..
0xC012ADCC 001E10C8 È...
此内存范围为FF
0x0012ADC0 FFFFFFFF ÿÿÿÿ
0x0012ADC4 FFFFFFFF ÿÿÿÿ
0x0012ADC8 FFFFFFFF ÿÿÿÿ
0x0012ADCC FFFFFFFF ÿÿÿÿ
由于MMU,我们发现数据实际存储在0xC0000000区域。
因为我处于调试模式,我可以使用以下值手动更改此区域:
0x0012ADC0 F4F4F4F4 ôôôô
0x0012ADC4 3F3F3F3F ????
0x0012ADC8 F2F2F2F2 òòòò
0x0012ADCC 1F1F1F1F ....
现在2-3个程序集执行,我有这个装配线:
ldr r3, [r11, #-24]
我执行这一行,我在r3中有这个值:
r3=0x1f1f1f1f
(如果我不改变0x0012ADC0和0x0012ADCC之间的内存,我通常会得到0xFFFFFFFF ...)
我真的不明白为什么r3不等于0x1E10C8。这就像MMU在执行str命令时完成它的工作,但是当执行ldr时,MMU没有转换地址(0x0012ADCC而不是0xC012ADCC)。这里有一些我无法理解的东西。
以防万一,以下是所涉及的汇编指令:
kapiReceiveQueue:
000195fc: push {r11, lr}
00019600: add r11, sp, #4
00019604: sub sp, sp, #32
00019608: str r0, [r11, #-24] <----- r0 stored physically at C012ADCC
0001960c: str r1, [r11, #-28]
00019610: str r2, [r11, #-32]
00019614: strb r3, [r11, #-33] ; 0x21
693 switch (Option)
00019618: ldrb r3, [r11, #-33] ; 0x21
0001961c: cmp r3, #2
00019620: beq 0x1974c <kapiReceiveQueue+336>
...
0001974c: ldr r3, [r11, #-24] <------ r3 get the value of physical address 0x12ADCC
00019750: ldr r2, [r3]
00019754: sub r3, r11, #17
00019758: mov r0, r2
如果这与我的编译标志有任何关系,那么它们是:
arm-none-eabi-gcc -march=armv4t -mcpu=arm7tdmi -dp -DNG_COMP_GCC -c
-Wa,-adhlns="../../Base/Lib/Pa/Kapi.o.lst" -fmessage-length=0 -fno-zero-initialized-
in-bss -MMD -MP -MF"../../Base/Lib/Pa/Kapi.d" -MT"../../Base/Lib/Pa/Kapi.d" -fpic
-mlittle-endian -Wall -DNGHW_TOPMEM_ADDR=0x00800000 -DNG_CPU_ARM -DNG_CPU_ARMv4T
-DNG_CODE_ARM -DNG_LITTLE_ENDIAN -DNG_DEBUG -DNG_RTOS -DNG_COMP_GCC -DNG_RTOS_UCOSII
-DDHCP_CLIENT -g3 -gdwarf-2 ../../Base/Kernel/Alos/Ucos-II/Kapi.c -o"../../Base/Lib/Pa/Kapi.o"
任何帮助将不胜感激!!