我的应用程序被分割成几个静态库,最后连接在一起。
其中有一个库是PORT库,里面有中断处理程序的源代码。如果我的isr.cpp的源代码如下图所示,sys_tick_handler的定义其实是优化出来的,每当sys_tick中断发生时,就会调用null_handler。我创造了简单的解决方法,在isr.h中声明某种虚函数,然后在isr.cpp文件中定义它。然后我需要在我的main中调用这个虚函数。这很有帮助,因为毕竟sys_tick中断是在调用isr.cpp的处理程序。但我并不引以为豪,正如我所说的,这只是个变通的办法--所以我想知道如何才能在不做这些黑客的情况下解决这个问题。
下面是 isr.cpp 的代码。
extern "C" {
void sys_tick_handler(void)
{
}
}
解决方法 isr.h
void func();
变通方法 isr.cpp
void func() {}
extern "C" {
void sys_tick_handler(void)
{
}
}
假设你的代码中某处定义了一个向量表,那么中断处理程序的名称是 必须 匹配这些名称。
例如,如果你使用STM的启动代码,你的sys tick处理程序将必须调用 SysTick_Handler
. 只要检查你的启动代码,看看你有什么。
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
.word BusFault_Handler
.word UsageFault_Handler
.word 0
.word 0
.word 0
.word 0
.word SVC_Handler
.word DebugMon_Handler
.word 0
.word PendSV_Handler
.word SysTick_Handler
/* External Interrupts */
.word WWDG_IRQHandler /* Window WatchDog */
.word PVD_IRQHandler /* PVD through EXTI Line detection */
.word TAMP_STAMP_IRQHandler /* Tamper and TimeStamps through the EXTI line */
.word RTC_WKUP_IRQHandler /* RTC Wakeup through the EXTI line */
.word FLASH_IRQHandler /* FLASH */
/* ... */
如果你定义了很多没有主体的处理程序(像你这样),或者处理程序完全相同,编译器就会只留下一个定义,优化掉重复的代码。