GCC:指定实际符号的目标地址

时间:2015-04-16 18:44:30

标签: c gcc linker symbols

知道已经问了好几次类似的问题,让我来解释一下我尝试做什么以及为什么:我有一个嵌入式系统,它包含一个ARM Cortex-M4微控制器和一个FPGA。 FPGA可以由板载闪存配置,甚至不需要微控制器。但有时微控制器能够重新配置FPGA会很好,因此它可以访问所需的编程信号。

需要发送到FPGA的比特流大约为150kBytes,但变化频率远低于MCU固件。由于使用编程器/调试器(Segger J-Link)编程了大量数据需要一些时间,因此每次固件更改时我都不希望擦除和重新编程此比特流(但比特流相同)。调试器只对那些实际已经改变的存储器块进行重新编程,因此如果位流总是位于同一地址,它会很乐意跳过对比特流的编程。但是,如果我只是像

那样包含它,那显然不是这种情况
static const uint8_t fpga_bitstream[] = {
  // ...
};

因为链接器可以自由决定将数据放在何处。

现在的问题是:让链接器将此符号始终放在同一地址会是什么(不是太过于干扰)的方式?我知道--defsym链接器选项,但是当在源文件中定义有问题的符号时(而不是仅仅被引用并声明为extern),这似乎被忽略了。我知道哪个工作的唯一方法(我之前已经使用过)是使用自定义链接器文件在MEMORY部分定义一个单独的分区,然后创建一个新的部分来放置符号进入,使用例如

static const uint8_t fpga_bitstream[] __attribute__((section(".fpgabitstream"))) = {
  // ...
};

但是,该项目使用一个小型操作系统(Nut/OS),它带来了自己的链接器文件。如果我可以使用-Tfile.ld选项向其添加一些数据,那我就没事了,但我不想更改原始脚本,因为它位于源代码树中。操作系统本身。

谢谢, 菲利普

1 个答案:

答案 0 :(得分:0)

由于似乎无法“添加”到现有的链接描述文件,可能最简单的解决方案是保留一个单独的闪存区域(例如,一个固定地址靠近一端的区域,稍作保留未来增长)用于FPGA配置和来自该固定地址的负载。

由于可能没有任何用处,你可以从MCU端对FPGA比特流做任何有用的事情(除了加载它),我认为将FPGA配置嵌入你的MCU二进制文件没有任何优势。您只需要MCU代码中的起始地址和大小,--defsym链接器选项可以让MCU知道这些内容和大小(不需要修改链接描述)。

我有一个非常相似的配置(FPGA配置和MCU代码生活在闪存的不同区域),这个效果很好。只有FPGA瞬间闪存才能正常使用MCU闪存。