你有两个选择。
- 按照你的建议复制它们,用
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信息定义,具体取决于您的板的地址。所有这些都将记录在一个文件中。请务必生成一个文件并检查地址以仔细检查您的脚本。FLASHTCM_MEMMAPMAPld
第二种情况还需要一份副本(在启动时或至少在第一次TCM使用功能之前)。但是,编译器可以使用绝对地址,它们将在TCM内存中。main 中的任何函数DRAM也可以直接调用该TCM函数。对于第一种情况,您必须使用函数指针来调用TCM代码。如果您希望将全局变量放置在此内存中,您可以使用属性将它们放在不同的部分中,并使用gnu ld适当地放置它们。我认为有ITCM和DTCM?所以也许这不适用于你,或者你需要两个部分。
链接描述文件更通用,如果您将复杂的功能放在TCM. 仅使用-fpic, etc 和复制可能会使事情快速运行,尤其是在您只有一个pure功能的情况下。