GNU链接器,相同内存区域的不同地址

问题描述 投票:0回答:1

所以我为我的stm32f7 MCU有一个简单的链接描述文件

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_vector并考虑了偏移量]

例如,这是我的bin文件,将要闪烁:

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

如您所见,大量的闪存被浪费了,并且也试图将这个bin写入闪存边界之外。

VS:

00000000  00 00 01 20 09 00 00 08  00 20 70 47              
0000000c

此hexdump,是我正在寻找的,但是,正如您所看到的,Reset_Handler具有AXIM总线的地址。我想要做的是通过使用上面提供的链接器脚本来获得如下输出:

00000000  00 00 01 20 09 00 20 00  00 20 70 47              
0000000c 

这里的区别是它将使用0x00200008查找我的重置处理程序。

到目前为止我尝试过的是:

.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加载指令,并以此将向量表的第一项(堆栈指针)作为指令加载

linker stm32 gnu
1个回答
0
投票

我设法通过咨询gnu链接器页面来解决问题。我所做的是指定像这样的部分的运行时偏移量。

© www.soinside.com 2019 - 2024. All rights reserved.