gcc 在C中,如何将函数放在一个节中而不阻止它们被优化出来

px9o7tmv  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(152)

我正在做一个嵌入式项目:ARMv7与GCC我一直把代码放在RAM中,这样它就可以运行得更快,我的RAM快用完了,所以我必须开始妥协。我可以从多个内存位置运行代码,如:

  • 闪光(缓慢但充足)
  • 普通RAM(速度很快,但大小有限)
  • ITCM(比RAM快,但尺寸非常有限。)
  • 外部QSPI闪存
  • 等等...

我想要完成的是根据特定代码段的特定需求将代码分布在不同的内存类型中。让我们看看以下两个函数:

void func_1(){ do-something time-critical ... }
void func_2(){ do-something else also time critical ... }

不做任何其他事情,我的有点标准的链接器文件看起来像这样:

.text :
{
    . = ALIGN(4);
    *(.text .text.* )
    *(.glue_7t) *(.glue_7)  
    .
    .
    .
} > rom

编译和链接后,.map文件看起来像这样:

.text.func_1
    0x0044ba90      0x58 /src/some_file.0
.text.func_2
    0x0044bae8      0x78 /src/some_file.0

在这一点上,一切都很好,非常重要的是,如果例如func_2()没有从任何代码中调用,它就会被优化。
当我开始将函数放置在相应的内存区域中时,我这样修改它们:

__attribute__ ((section(".ramfunc")))
void func_1(){ do-something... }

__attribute__ ((section(".ramfunc")))
void func_2(){ do-something else ... }

然后,我将使用我的链接器文件,将“fast_run”部分放在RAM中

.relocate :
{
    . = ALIGN(4);
    _srelocate = .;
    *(.ramfunc .ramfunc.*);
    .
    .
    .
} >ram AT>rom

编译和链接后,.map文件看起来像这样:

.ramfunc    0x2040f000      0x136 /src/some_file.0
            0x2040f000               func_1
            0x2040f058               func_2

函数现在在RAM中,这很好,但在.ramfunc中没有自己的子部分,它们都在**.ramfunc中。最初我认为这很好,但在这种安排下,即使我的程序没有其他部分调用func_2,它也不会得到优化。
我假设,通过失去子节的名称,我防止链接器从“优化的东西了”我如何修复?我希望能够将函数放置在适当的内存区域中,但如果不使用它们,仍然允许它们被优化。有没有一种方法可以将函数放在节中,同时保留它们的子节名称?
我在文档中搜索了attribute((section)),但没有找到任何有用的内容。我还试图找到一个解释,关于那些以.text.func_1形式的子部分是如何生成的,以及我是否可以影响这个过程,但我还是找不到解决方案。
使用类似这样的东西:

.relocate :
{
    .
    .
    /src/fast_code.o (.text .text.* )
} >ram AT>rom

当然工作得很好,但是作用于整个文件,缺乏我试图为代码的某些部分实现的每个函数的粒度。

hwazgwia

hwazgwia1#

我相信这个GCC编译器选项可以帮助:- 功能部分。它将为每个功能创建单独的部分。有一个类似的选项来处理数据节。
只有在指定了--gc-sections的情况下,链接器才会丢弃节。
最后,启动代码、重置向量和其他没有引用的重要内容可能会被丢弃。为了防止这种情况,请在链接器文件中使用KEEP()指令,例如:return(*(.text. Boot ));

相关问题