gpt4 book ai didi

c - gcc:你能把函数指针放到不同的部分(不是.data)吗?

转载 作者:太空狗 更新时间:2023-10-29 17:26:05 25 4
gpt4 key购买 nike

为了在主机上对嵌入式项目进行单元测试,我开始使用函数指针,以便能够在运行时在函数的“真实”实现和模拟之间切换。所以,我的函数“foo”在 .c 文件中看起来像这样:

// 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 中没有这样的选项专门将所有函数指针放在特定的部分中。当然,除非您重写编译器和链接器规则。

您必须使用 __attribute__ 关键字,正如您在问题中提到的那样。如果代码看起来很复杂,您可以围绕它创建一个宏:

#define SPECIAL_FOO(x) void (*x) ( ) __attribute__ (( section(".ext_mem"))) 

然后像这样使用它:

SPECIAL_FOO(foo) = fooImplementation;

然而,还有另一种方式。您可以查看此 SO 线程以了解有关创建自定义链接描述文件以完成您的任务的更多信息:Forcing certain compiler-generated variables into specific ELF sections (with gcc)

关于c - gcc:你能把函数指针放到不同的部分(不是.data)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24362867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com