所以我为我的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加载指令,并以此将向量表的第一项(堆栈指针)作为指令加载
我设法通过咨询gnu链接器页面来解决问题。我所做的是指定像这样的部分的运行时偏移量。