Программа по любому адресу в ассемблере ARM cortex M3 - PullRequest
0 голосов
/ 23 февраля 2019

Кто-нибудь знает, как поместить программу в ассемблер ARM по произвольному адресу в памяти?По умолчанию программа расположена, начиная с адреса 0x00000008, но необходимо, чтобы она находилась, например, по адресу 0x20002000.Я пытался использовать DCD 0x20002000, но это только меняет указатель регистра, в то время как программа остается по старому адресу.Команда SPACE 0x400 работает хорошо, но если адрес слишком велик, то компиляция занимает очень много времени.Подскажите, может сталкивался с этим?

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Существует два основных способа управления местоположением области кода с помощью Keil.Либо с помощью разбросанного файла, либо с помощью вкладки «target» в диалоге параметров сборки.

Вы можете определить регион IROM, который включает регион, в котором вы хотите разместить свой код.Вы также можете начать с помощью этого диалога для создания исходного файла разброса, а затем изменить файл разброса на основе документации Keil.

Тем не менее, указанное вами местоположение находится в области ОЗУ, которая немногонеобычно (возможно, неэффективно, но действует).Рассматривали ли вы, как инициализировать вашу цель после ее выключения?

Самая большая проблема заключается в том, что при перезагрузке Cortex-M3 ВСЕГДА будет читать с адресов 0, 4 (и 8 из-за предварительной выборки).Вам необходимо предоставить начальный указатель стека (или не использовать стек) и вектор сброса (с битом 0, T-бит, установлен).Может быть аппаратная банкировка карты памяти (зависит от устройства), но программист всегда считает, что эти выборки начинаются с адреса 0.

0 голосов
/ 23 февраля 2019

Обычно этого можно достичь, изменив используемый скрипт компоновщика или предоставив определенные параметры командной строки для GNU ld.

Исходя из предоставленной вами информации, я предполагаю, что ваш код в настоящее времяначиная сразу после двух первых таблиц векторных записей, т. е. начального значения SP и значения сброса, и того, что ваша векторная таблица расположена в 0x00000000.

example1.s более или менее должен выглядеть как ваш текущий код:

        .cpu    cortex-m3
        .thumb    
        .syntax unified
        .global Reset_Handler
        .equ    StackTop, 0x1000
        .word   StackTop         
        .word   Reset_Handler
Reset_Handler:
         b .
        .end


/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-as -o example1.o -c example1.s
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld -g -e Reset_Handler -Ttext-segment=0x00000000 -Map=example1.map -o example1.elf example1.o
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-objdump -d example1.elf

example1.elf:     file format elf32-littlearm

Disassembly of section .text:

00000000 <Reset_Handler-0x8>:
   0:   00001000        .word   0x00001000
   4:   00000008        .word   0x00000008

00000008 <Reset_Handler>:
   8:   e7fe            b.n     8 <Reset_Handler>

Код будет расположен по адресу 0x00000008.example2.s определяет новый раздел компоновщика с именем .vectors.

Теперь мы будем использовать параметр командной строки GNU ld --section-start, чтобы раздел .vectors находился в 0x00000000, и по-прежнему использовать -Ttext-сегмент, чтобы заставить текстовый сегмент / текстовый сегмент находиться в 0x20002000.

example2.s:

    .cpu    cortex-m3                                                                                                                                                                                                                                              
    .thumb                                                                                                                                                                                                                                                                 
    .syntax unified                                                                                                                                                                                                                                                        
    .global Reset_Handler                                                                                                                                                                                                                                                  
    .equ    StackTop, 0x1000                                                                                                                                                                                                                                               

    .section .vectors                                                                                                                                                                                                                                                      
    .word   StackTop                                                                                                                                                                                                                                                       
    .word   Reset_Handler                                                                                                                                                                                                                                                  

    .section .text                                                                                                                                                                                                                                                         

Reset_Handler:
b.

/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-as -o example2.o -c example2.s
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld -g -e Reset_Handler --section-start=.vectors=0x00000000 -Ttext-segment=0x20002000 -Map=example2.map -o example2.elf example2.o
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-ld: warning: address of `text-segment' isn't multiple of maximum page size
/opt/arm/gcc-arm-8.2-2019.01-x86_64-arm-eabi/bin/arm-eabi-objdump -d -j .vectors -j .text -d example2.elf

example2.elf:     file format elf32-littlearm


Disassembly of section .vectors:

00000000 <.vectors>:
   0:   00001000        .word   0x00001000
   4:   20002000        .word   0x20002000

Disassembly of section .text:

20002000 <Reset_Handler>:
20002000:       e7fe            b.n     20002000 <Reset_Handler>
        .end    

Таблица векторов по-прежнему расположена в правильном месте памяти, но код теперь находится по адресу 0x20002000.

Чтобы описать точные изменения, необходимые в используемом вами сценарии компоновщикадля достижения того же результата мне нужно будет увидеть его содержание.

...