你有两个选择。
- 按照你的建议复制它们,用
pc relative
.
- 使用具有不同加载/运行地址的链接器文件。
只有当例程不使用任何绝对地址时,一个简单的副本才会起作用。如果他们确实使用绝对地址可能没问题,因为我猜你会在标准 RAM 中留下一个副本。但是,这可能无法获得TCM
.
使用链接描述文件,您可以指定不同的LOAD
位置RUN
。
sections {
.text { *(.text); } >FLASH
.tcm {
*(.tcm);
} >TCM_MEM AT>FLASH
.data { *(.data); } > RAM
.bss : NOLOAD { *(.bss); } > RAM
}
特别注意AT>FLASH
。
另请参阅:gnu 链接器映射文件...以及有关stackoverflow的更多内容。Gnu Ld 手册包含有关部分的信息LMA
(加载地址)。您LMA
将是flash,但VMA
(RUN地址)将是TCM。上面的手动链接还显示了如何复制。、和使用 ld MEMORYRAM
信息定义,具体取决于您的板的地址。所有这些都将记录在一个文件中。请务必生成一个文件并检查地址以仔细检查您的脚本。FLASH
TCM_MEM
MAP
MAP
ld
第二种情况还需要一份副本(在启动时或至少在第一次TCM
使用功能之前)。但是,编译器可以使用绝对地址,它们将在TCM
内存中。main 中的任何函数DRAM
也可以直接调用该TCM
函数。对于第一种情况,您必须使用函数指针来调用TCM
代码。如果您希望将全局变量放置在此内存中,您可以使用属性将它们放在不同的部分中,并使用gnu ld适当地放置它们。我认为有ITCM
和DTCM
?所以也许这不适用于你,或者你需要两个部分。
链接描述文件更通用,如果您将复杂的功能放在TCM
. 仅使用-fpic
, etc 和复制可能会使事情快速运行,尤其是在您只有一个pure
功能的情况下。