gcc:你能把函数指针放到不同的部分(不是.data)吗?
为了在主机上对嵌入式项目进行单元测试,我开始使用函数指针,以便能够在运行时在函数的“真实”实现和模拟之间进行更改。 因此,我的函数“foo”在.c文件中如下所示:gcc:你能把函数指针放到不同的部分(不是.data)吗?,c,pointers,gcc,embedded,linker-scripts,C,Pointers,Gcc,Embedded,Linker Scripts,为了在主机上对嵌入式项目进行单元测试,我开始使用函数指针,以便能够在运行时在函数的“真实”实现和模拟之间进行更改。 因此,我的函数“foo”在.c文件中如下所示: // the 'real' implementation of the function to be used during runtime void fooImplementation ( ) { /* ... */ } // the function pointer, initialized to the 'real' i
// the 'real' implementation of the function to be used during runtime
void fooImplementation ( )
{
/* ... */
}
// the function pointer, initialized to the 'real' implementation
void (*foo) ( ) = fooImplementation;
结果表明,目标处理器(Blackfin)生成了一个异常,因为函数指针驻留在内部L1数据内存中,该内存不允许携带代码,只能携带数据
有效的解决方案是为每个函数指针分配一个属性,以便将其放入不在L1数据内存中的不同部分,例如:
void (*foo) ( ) __attribute__ (( section(".ext_mem"))) = fooImplementation;
但是这使得代码有点难以读取,并且容易出错(如果忘记分配属性,单元测试将正常运行,但是一旦在目标上调用函数,代码就会生成异常)
因此,我的问题是,是否有某种方法可以告诉gcc在默认情况下将所有函数指针放在不同的节中。在gcc中,默认情况下没有这样的选项专门将所有函数指针放在特定的节中。当然,除非您重写编译器和链接器规则 正如您在问题中提到的,您必须使用
\uuuuuu属性\uuuuu
关键字。如果代码看起来很复杂,可以在其周围创建一个宏:
#define SPECIAL_FOO(x) void (*x) ( ) __attribute__ (( section(".ext_mem")))
然后像这样使用它:
SPECIAL_FOO(foo) = fooImplementation;
不过,还有另一种方法。您可以通过此线程了解有关创建自定义链接器脚本以完成任务的更多信息: