我正在编写一个GNU链接器脚本文件,需要在正确的方向上轻推以解决以下问题。
正在为其创建链接描述文件的设备具有用于托管文本和rodata的flash。它还有用于托管数据和BSS的SRAM。
我创建了链接器脚本的变体,它具有: - 当DATA和BSS在SRAM中时,CODE和RODATA加载到闪存中 - SRAM中的CODE,RODATA,DATA和BSS
这些工作正常。
我现在必须创建一个链接器脚本的变体,它在flash中有大部分TEXT。但是某些名称以众所周知的后缀结尾的例程将被加载到SRAM中。
例如,我希望将Func1IRAMCode()和Func2__IRAMCode()加载到SRAM部分,而其他没有IRAMCode后缀的函数必须加载到flash中。
出于便携性原因,我不会将属性(部分)附加到这些SRAM功能。
这是我磕磕绊绊的地方。 文本部分具有以下规则:
.text :
{
*(.text .text.* .gnu.linkonce.t.*);
} > FLASH
.Misc :
{
* (.text.*IRAMCode);
} > SRAM
.data和.bss部分是单独定义的。
问题是* IRAMCode()正在获得分配的闪存地址。
从文本部分排除* IRAMCode的语法是什么?
你是如何在项目中解决这个问题的?
答案 0 :(得分:0)
执行此操作的方法是将您的函数放在另一个部分(例如.sram.text)中,为此,请为每个特定函数使用gcc的section属性(例如:__attribute__ (( section ".sram.text")
)。
因此,将所需部分通配到SRAM是非常容易的。