Linker GNU连接器,同一内存区域的不同地址

Linker GNU连接器,同一内存区域的不同地址,linker,stm32,gnu,Linker,Stm32,Gnu,因此,我有一个简单的链接器脚本为我的stm32f7单片机 MEMORY{ ROM_AXIM (rx) : ORIGIN = 0x08000000, LENGTH = 1M ROM_ITCM (rx) : ORIGIN = 0x00200000, LENGTH = 1M RAM_ITCM (rwx): ORIGIN = 0x00000000, LENGTH = 16K RAM_DTCM (rwx): ORIGIN = 0x20000000, LENGTH = 64K

因此,我有一个简单的链接器脚本为我的stm32f7单片机

MEMORY{
    ROM_AXIM (rx) : ORIGIN = 0x08000000, LENGTH = 1M
    ROM_ITCM (rx) : ORIGIN = 0x00200000, LENGTH = 1M
    RAM_ITCM (rwx): ORIGIN = 0x00000000, LENGTH = 16K
    RAM_DTCM (rwx): ORIGIN = 0x20000000, LENGTH = 64K
    SRAM     (rwx): ORIGIN = 0x20010000, LENGTH = 240K
    SRAM2    (rwx): ORIGIN = 0x2004C000, LENGTH = 16K
}

_estack = LENGTH(RAM_DTCM) + ORIGIN(RAM_DTCM);

SECTIONS{
    .isr_vector : { 
        KEEP(*(.isr_vector))
    } /* Placed at 0x0 */

    .text : {
        . = ALIGN(4);
        *(.text)
    } >ROM_ITCM

    .data : {
        . = ALIGN(4);   
        _sdata = .;
        *(.data)
        . = ALIGN(4);
        _sdata = .;
    } >SRAM2 AT>ROM_AXIM

    .bss : {
        . = ALIGN(4);
        _sbss = .;
        *(.bss)
        . = ALIGN(4);
        _ebss = .;
    } >SRAM2
}
其想法是将文本部分放置到ROM_ITCM,因为ART加速器可以加速指令获取。但问题是ROM_AXIM和ROM_ITCM是同一个闪存。如何告诉链接器物理上是相同的存储,但在不同的总线上访问。所以它像两条独立的总线一样连接,但文本部分实际上应该紧跟其后。isr_向量立即在内存中,偏移量被考虑在内

例如,下面是我的bin文件,它将转到flash:

00000000  00 00 01 20 01 00 20 00  00 00 00 00 00 00 00 00  |... .. .........|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00200000  00 20 70 47                                       |. pG|
00200004
正如你们所看到的,很多flash都被浪费了,我也会尝试把这个文件写在flash边界之外

VS:

这个hextump是我正在寻找的,但正如您所看到的,Reset_处理程序具有AXIM总线的地址。我要做的是使用上面提供的链接器脚本获得如下输出:

00000000  00 00 01 20 09 00 20 00  00 20 70 47              
0000000c 
这里的区别是,它将使用0x0020008查找我的重置处理程序

到目前为止我所尝试的:

.text : {
        . = ALIGN(4);
        *(.text)
    } >ROM_ITCM AT>ROM_AXIM
这一个可以工作,但问题是它会给出这个输出

00000000  00 00 01 20 01 00 20 00  00 20 70 47              |... .. .. pG|
0000000c

它将在0x00200000处加载指令,并通过这样做将向量表的第一个条目(堆栈指针)作为指令加载

我通过查阅gnu链接器页面解决了一个问题。我所做的是像这样指定节的运行时偏移量

.text (0x00200000 + SIZEOF(.isr_vector)): {
        . = ALIGN(4);
        *(.text)
    } AT>ROM_AXIM
它所做的是:

  • .text(0x00200000+SIZEOF(.isr\u vector))
    使用向量表大小的偏移量指定运行时地址。我的指针现在已正确解析
  • AT>ROM_AXIM
    将代码放在向量表之后,向量表首先产生偏移量。上面这条线就把它修好了
  • -
1。这不是运行时,在线链接时间。2.bin文件始终是线性和连续的。只有带有地址的格式才可以。@P_u_uj_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u__________
.text (0x00200000 + SIZEOF(.isr_vector)): {
        . = ALIGN(4);
        *(.text)
    } AT>ROM_AXIM