对于一个嵌入式设备,我有一个包含函数指针数组的文件,存储着中断处理程序,定义如下(无法修改):
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
,即在__vector_table
中存储blinkLed
的地址而不修改或重命名函数?
编辑:
我实际上使用GNU gcc 4.9.3和相关联的链接器(GNU ld 2.24.0)。我可以修改与项目相关的main.c
和Makefile。
void func(void)
(没有参数)和void func()
(未指定数量的参数)是不同的类型。对于没有参数的函数,请始终使用void
来避免问题。 - user694733weak
函数。 - LPsweak
函数,以执行真正的工作。我想知道是否有一种直接用执行真正工作的函数来覆盖weak
函数的方法。 - Garf365