首页 > 解决方案 > 从 ARM (Keil uVIsion) 的 C 代码生成部分并获取开始和结束符号,并防止链接器删除它们

问题描述

我正在用 C 语言为 ARM 开发一个嵌入式项目。我想在代码中创建一个部分,在其中定义一些函数,然后一个init函数将遍历它们以执行它们。就像是:

void f1(void) { ... } __section("some_section")
void f2(void) { ... } __section("some_section")
...
...
[In a different module]

typedef void (*funptr)(void);

void init_func(void) {
  funptr iter = &__some_section_start;
  do {
     *iter();
      iter++;
  } while (iter <= &__some_section_end);
}  

我知道可以通过修改项目链接描述文件来完成类似的事情,但我想知道是否可以在没有链接描述文件的情况下这样做。

我也尝试过,__attribute__((section("ARM.at.<address>")))但这不起作用,因为这会使一个功能与另一个功能重叠。

另外,我尝试使用一个典型的__attribute__((section(...)))反汇编生成的文件,看看Keil编译器是否生成了任何类型的符号来指示该部分的开始和结束。它不仅没有这样做,而且很多时候我在特定部分中创建的变量只是没有生成。我怀疑链接器正在剥离它,甚至使用volatileand attribute(used)(应该这样做)。如何防止链接器这样做?

标签: clinkerarmsymbolssections

解决方案


推荐阅读