9

我正在编写一个 ARM Cortex-R4,我有一些二进制文件,我想从 TCRAM 执行它们,只是为了看看性能的提高是否足够好。

我知道我必须编写一个函数来将二进制文件复制到 RAM(这可以通过链接描述文件完成,并且知道二进制文件的大小)。但是他们会怎么跑呢?

想象一下:第一个二进制文件有 func1()、func2()、func3() 和 func4()。我将整个模块复制到 TCRAM,我将如何在那里调用函数?我必须使用指向该特定函数的函数指针吗?如果 func4() 调用 func2() 和 func3() 会怎样?如果我没记错的话,他们会指向闪存中的一段代码。这是否意味着我必须重新编写那些函数?完全使用函数指针?有人告诉我,仅链接描述文件就足以完成所有这些工作,我无需担心任何事情,但我仍然不明白它是如何工作的。

4

3 回答 3

11

在 GCC 上:只需将函数放在 .data 部分:

__attribute__( ( section(".data") ) )

它将被启动代码与您初始化的其余变量一起复制(无需弄乱链接器脚本)。如果函数在放入 RAM 后与其余代码“相距甚远”,您可能还需要一个“long_call”选项。

__attribute__( ( long_call, section(".data") ) )

例子:

__attribute__( ( long_call, section(".data") ) ) void ram_foobar (void) { ... }

您可能会收到可以安全忽略的编译器警告:

Warning: ignoring changed section attributes for .data
于 2014-08-28T19:59:31.953 回答
6

你有两个选择。

  1. 按照你的建议复制它们,用pc relative.
  2. 使用具有不同加载/运行地址的链接器文件。

只有当例程不使用任何绝对地址时,一个简单的副本才会起作用。如果他们确实使用绝对地址可能没问题,因为我猜你会在标准 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,但VMARUN地址)将是TCM。上面的手动链接还显示了如何复制。、和使用 ld MEMORYRAM信息定义,具体取决于您的板的地址。所有这些都将记录在一个文件中。请务必生成一个文件并检查地址以仔细检查您的脚本。FLASHTCM_MEMMAPMAPld

第二种情况还需要一份副本(在启动时或至少在第一次TCM使用功能之前)。但是,编译器可以使用绝对地址,它们将在TCM内存中。main 中的任何函数DRAM也可以直接调用该TCM函数。对于第一种情况,您必须使用函数指针来调用TCM代码。如果您希望将全局变量放置在此内存中,您可以使用属性将它们放在不同的部分中,并使用gnu ld适当地放置它们。我认为有ITCMDTCM?所以也许这不适用于你,或者你需要两个部分。

链接描述文件更通用,如果您将复杂的功能放在TCM. 仅使用-fpic, etc 和复制可能会使事情快速运行,尤其是在您只有一个pure功能的情况下。

于 2013-02-28T17:51:13.143 回答
3

现在(当时也是?)你可以只使用宏__RAM_FUNC__RAMFUNC_EXT(bank, name)或者__RAMFUNC(bank)

于 2018-08-20T06:09:56.807 回答