Почему STR работает только для адресов от 0x40000000 до 0x40003FFF? - PullRequest
0 голосов
/ 25 марта 2019

Код:

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.

1 Ответ

2 голосов
/ 29 марта 2019

Мне не удалось найти таблицу данных для "LPC2140", но я нашел таблицу данных для того, что, по-видимому, является семейством устройств вместо этого, и что у вас может быть конкретный LPC2142 / 2144.Таблица , раздел 6.4, показывает, что SRAM сопоставлен с 0x40000000-0x40003FFF (исходя из того, что вы сказали, что у вас есть вариант SRAM 16 КБ).Это единственное адресное пространство, которое вы должны рассматривать как ОЗУ общего назначения.Все, что находится за пределами этого диапазона в соответствии с таблицей данных, выглядит страшно, и вам следует избегать этого, если вы не полностью знаете, что делаете.

Одна вещь, о которой вы также должны знать, это доступ без выравнивания .STR записывает полное слово сразу (4 байта), поэтому адрес должен быть выровнен по границе слова.0x40003FFF не выровнен по 4-байтовой границе;вместо этого вы должны были писать 0x40003FFC.Если вы просто хотели записать один байт в 0x40003FFF, вы должны были использовать STRB.

...