中断处理程序的定义被优化掉了,所以空处理程序被称为

问题描述 投票:-2回答:1

我的应用程序被分割成几个静态库,最后连接在一起。

其中有一个库是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)
{

}
}
c++ microcontroller stm32
1个回答
0
投票

假设你的代码中某处定义了一个向量表,那么中断处理程序的名称是 必须 匹配这些名称。

例如,如果你使用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                        */                                          

  /* ... */

如果你定义了很多没有主体的处理程序(像你这样),或者处理程序完全相同,编译器就会只留下一个定义,优化掉重复的代码。

© www.soinside.com 2019 - 2024. All rights reserved.