Почему это не изменит значения некоторых элементов в массиве1 в памяти? - PullRequest
0 голосов
/ 23 марта 2019

Я написал некоторый ассемблерный код на Keil, где, если элемент в массиве <5, программа увеличивает этот элемент. Проблема в том, что код ARM не изменяет значения array1 в памяти. Какие изменения мне нужно сделать, чтобы сделать это? </p>

    ADR r0, array1      ; loads address of 'a' to r0

    MOV r1, #0          ; r1 = index

L0  CMP r1, #8
    BGE stop
    LDR r2, [r0, r1, LSL#2] ; load content of array1[index] to r2
    CMP r2, #5
    ADDLT   r2, r2, #1      ; array1[index]++
    STRLT   r2, [r0, r1, LSL#2] ; store r2 as content of array1[index]
    ADD r1, r1, #1      ; index++
    B   L0

stop B  stop
array1  DCD 1, 7, 4, 9, 2, 3, 8, 6
    END

1 Ответ

1 голос
/ 26 марта 2019

Ниже приведена карта памяти для Cortex-M3 DesignStart Eval.Конечно, это Cortex-M, а не ATM7TDMI, но это хорошо в качестве примера.

Здесь вы можете видеть, область FLASH, различные области расширения, периферийные устройства и различные типы оперативной памяти.Вы можете сравнить это с картой памяти LPC2140, чтобы проверить соответствующие адреса для вашего устройства.

Как правило, для программного кода области FLASH доступны только для чтения (для изменения FLASH требуется специальная последовательность управления, специфичная дляактуальная часть).Области, отмеченные как расширение на этой диаграмме, не имеют ничего.Доступ к этим должен неисправен (с идеалистической точки зрения), но также может быть просто проигнорирован.В DesignStart это регионы, где дизайнеры могут добавлять свое собственное оборудование.Единственная область, которую ваш код может надежно использовать для хранения с возможностью чтения / записи, - это области ОЗУ.ARM-7 не имеет четко определенной карты памяти ARMv7-M, но для устройства LPC2140 вы можете быть уверены, что ОЗУ находится между 0x40000000 и 0x40001FFF (а также FLASH начиная с 0x00000000).

Архитектура ARM позволяет использовать область кода в качестве данных (так что литералы могут быть встроены в код и доступны как переменные).Это не гарантирует, что память кода может быть изменена.

Fig 4-1 from ARM100894_0000_00_en

Рис. 4-1 из ARM100894_0000_00_ru

...