繁体   English   中英

在ARM Cortex M3汇编器中的任何地址进行编程

[英]Program at any address in ARM cortex M3 assembler

有谁知道如何将程序放入内存中任意地址的ARM汇编器中? 默认情况下,该程序位于地址0x00000008开始,但是有必要将其例如定位在地址0x20002000上。 我尝试使用DCD 0x20002000 ,但这只会更改寄存器指针,而程序仍保留在旧地址。 SPACE 0x400命令运行良好,但是如果地址太大,则编译将花费很长时间。 告诉我,也许面对这个?

在此处输入图片说明

基本上,有两种方法可以使用Keil来控制代码区域的位置。 使用分散文件,或使用构建选项对话框中的“目标”选项卡。

您可以定义一个IROM区域,其中包括您要放置代码的区域。 您也可以使用此对话框开始生成初始分散文件,然后根据Keil文档修改分散文件。

但是,您在此处给出的位置在RAM区域中,这有点不寻常(可能效率低下,但有效)。 您是否考虑过重启电源后如何初始化目标?

最大的问题是,在复位时,Cortex-M3总是会从地址0、4(由于预取而导致的地址为8)进行读取。 您需要提供一个初始堆栈指针(或不使用堆栈),以及复位向量(设置为0,即T位)。 内存映射可能存在硬件存储区(特定于设备),但是程序员的观点始终是,这些提取始于地址0。

通常,您可以通过修改所使用的链接描述文件或为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-segment来强制.text节/文本段驻留在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。

为了描述在链接器脚本中实现相同结果所需的确切更改,我需要查看其内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM