Linker GNU连接器,同一内存区域的不同地址
因此,我有一个简单的链接器脚本为我的stm32f7单片机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
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
-
.text (0x00200000 + SIZEOF(.isr_vector)): {
. = ALIGN(4);
*(.text)
} AT>ROM_AXIM