Получение ПК (R15), чтобы указать на мой код после размещения его в оперативной памяти по нужному адресу с Keil, на встроенном устройстве ARM - PullRequest
0 голосов
/ 06 марта 2019

Мне нужно разместить свою программу по адресу в памяти 0x20000000. В настройках проекта в Keil я открыл вкладку «Цель» и установил следующие настройки (скриншот здесь -> https://i.imgur.com/wL88jqR.png):

IROM1 start = 0x20000000
IROM1 size  = 0x400
IRAM1 start = 0x20001000
IRAM1 size  = 0x20000

Это мой код, который я хочу разместить по нужному мне адресу:

STACK_TOP EQU 0x20000100
    AREA RESET, DATA, READONLY
    DCD STACK_TOP 
    DCD Start
    AREA PROGRAM, CODE, READONLY
    ENTRY
Start
    NOP
    NOP
    NOP
    b Start
END

После компиляции я получаю 0 ошибок и 0 предупреждений:

*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'C:\Program Files\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
".\Objects\main.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:00

Затем в режиме отладки я нашел свои шестнадцатеричные команды по нужному мне адресу (скриншот здесь -> https://i.imgur.com/aDohAV7.png):

     8:     NOP 
0x20000008 BF00      NOP      
     9:         NOP 
0x2000000A BF00      NOP      
    10:         NOP 
0x2000000C BF00      NOP      
    11:         b Start 
0x2000000E E7FB      B        0x20000008

Но проблема в том, что я не могу выполнить его, поскольку счетчик программы всегда равен 0x00000000 и не изменяется ни в режиме работы, ни в пошаговом режиме. Что я сделал не так?

Ответы [ 2 ]

1 голос
/ 12 июня 2019

В режиме отладки вы можете увидеть двоичный файл, загруженный в ОЗУ, потому что Keil сделает это за вас через отладчик, например, ULINK.Тем не менее, это только 1 раз, содержимое ОЗУ будет очищено в следующем цикле питания, и ваш двоичный файл будет потерян, как только вы перезагрузите процессор.Идея состоит в том, что вы можете поместить свою программу в ОЗУ, но двоичный файл должен храниться в постоянной / энергонезависимой памяти (NVM).

Инструкции по достижению того, что вам нужно, приведены в эта статья от Keil.

Обратите внимание, что вам все еще нужен код в вашем NVM для начальной загрузки вашего приложения.Невозможно запустить с пустым NVM с процессорами Cortex-M.

Ваш программный счетчик застрял на 0x00000000, потому что там нет таблицы векторов для продолжения.При запуске Cortex-M3 просматривает таблицу векторов (по умолчанию расположенную по адресу 0x00000000) и ищет начальный адрес обработчика сброса (этот адрес хранится по адресу 0x00000004).В обработчике сброса вы можете скопировать бинарный файл в ОЗУ, как показано в статье, затем вызвать основную программу в ОЗУ и запустить в обычном режиме.

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

Предположительно обработчик прерывания указывает на адрес 0, и вы попадаете в состояние блокировки. Вы не можете избежать использования по крайней мере адреса 0x4 с Cortex-M. Это нормально иметь 0x2000001 по адресу 0x4. (если все еще довольно неполно).

Более полной реализацией может быть запись 0x20000101 в 0x4 и установка VTOR для указания таблицы векторов, начинающейся с 0x20000000 (которую вы захотите организовать для заполнения как можно скорее).

...