Инструкция 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" 

Любая помощь будет оценена!!

0 ответов

Другие вопросы по тегам