Инструкция str и ldr не использует один и тот же адрес
У меня есть эта странная проблема, когда MMU переводит память для str, но не для инструкции ldr. Я компилирую, используя gcc (без оптимизации) для arm7TDMI.
Программа вводит функцию и сохраняет 4 параметра в стеке (от r0 до r3). У меня есть эти регистры:
r0 = 0x1e10c8
r1 = 0x12adf0
r2 = 0x0
r3 = 0x2
r11 = 0x12ade4
MMU активен, и все между 0x0 и 0x00FFFFFF физически расположено между 0xC0000000 и 0xC0FFFFFF.
ПК выполняет следующие 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 ÿÿÿÿ
Мы видим, что данные были физически сохранены в области 0xC0000000 из-за MMU.
Поскольку я нахожусь в режиме отладки, я могу вручную изменить эту область следующим значением:
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"
Любая помощь будет оценена!!