【发布时间】:2018-05-18 17:35:15
【问题描述】:
对于嵌入式设备,我有一个文件,其中包含一个数组,其中包含存储中断处理程序的函数指针,像这样定义(我不能修改它):
typedef void (*const ISRFunction)(void);
__attribute__((weak)) void ISR0(void){ for(;;); }
__attribute__((weak)) void ISR1(void){ for(;;); }
...
__attribute__((weak)) void ISR78(void){ for(;;); }
...
ISRFunction __vector_table[0x79] =
{
(ISRFunction)&ISR0,
(ISRFunction)&ISR1,
...
(ISRFunction)&ISR78,
...
}
我有第二个文件,它定义了一些我无法修改的函数。这个文件是这样的:
void blinkLed(void)
{ ... }
最后,我有一个主源文件,带有main 功能和设备配置。在中断 78 上,我想闪烁 LED。于是我就这样写了一个强大的函数ISR78:
void ISR78(void)
{
blinkLed();
}
我想知道是否有解决方案可以直接通过blinkLed 覆盖弱函数ISR78,ie 将blinkLed 的地址存储在__vector_table 内而不修改它或重命名函数? p>
编辑:
我实际上使用 GNU gcc 4.9.3 和相关的链接器 (GNU ld 2.24.0)。我可以修改与项目关联的main.c 和 Makefile。
【问题讨论】:
-
一些编译器(不知道你的)支持符号别名,这可能需要研究一下。
-
另外,您应该非常具体地了解函数类型:
void func(void)(无参数)和void func()(未指定数量的参数)是不同的类型。始终将void用于不带参数的函数以避免出现问题。 -
@user694733 谢谢你的建议,我会注意的
-
可能我不是问题的全球视野,但
weak旨在允许“覆盖”功能,不是吗?因此,您可以定义/实现您的 same_name_function 以覆盖weak之一。 -
@LPs 我已经这样做了。我用 same_name_function 覆盖
weak函数,用作包装器来执行实际工作。我想知道一种方法可以直接覆盖weak函数,函数做真正的工作
标签: c ld weak-linking