带有中断处理程序和C ++的Keil ARM编译器中的错误?


8

我在Keil ARM编译器中为LPC1114编写中断处理程序时遇到问题。当我用C ++编写程序并指定--cpp编译器选项时,中断处理程序中的所有代码都会消失,它将被无限循环替换。我编写了说明我的麻烦的简单程序。

#include "LPC11xx.h"           // LPC11xx definitions
#define SYSTICK_DELAY 120000   // for 10 ms systick @ 12MHz osc

void SysTick_Handler(void)
{
  __NOP();
}

int main (void) 
{
  SystemInit();                   // from system_LPC11xx.c
  SysTick_Config(SYSTICK_DELAY);  // from core_cm0.h
  // Loop forever
  while (1) __NOP();
}

当尝试使用--cpp编译器选项编译此代码时,我在disasm中遇到无限循环:

SysTick_Handler PROC
            EXPORT  SysTick_Handler           [WEAK]
            B       .
            ENDP

这是上面程序中的__NOP()所在的地方。当我使用--c99编译器选项或不使用其他选项来编译代码时,它就在那里。Keil MDK版本是4.12。谁能告诉我有什么解决方案或解决方法吗?


由于您的ISR没有采取任何措施,仅仅是将其优化了吗?也许您可以尝试禁用优化或volatile在其中声明某些内容。
尼克T 2010年

优化设置为-level0,时间优化-取消选择。__NOP()并非没有。但是我也尝试在中断处理程序中更改全局变量或调用函数。上面提供的代码已简化为很小,可以重现该问题。
x4mer 2010年

1
向Keil提出了技术支持请求,任何答复都将在此处重新发布。
x4mer 2010年

为什么需要__NOP(); 呼叫?您不能只使用简单的分号吗?
凯文·维米尔

Answers:


14

“弱”引用仅表示该例程将被您的同名代码中的例程替换。当使用C时,这很简单,名称将始终相同,但C ++名称会破坏函数(用于函数重载等),因此,已编译的名称可能与默认的ISR名称不匹配。您需要在外部“ C”包装器中包装函数(或至少使用前向引用,我不确定我主要在C中工作的细节),以强制编译器不破坏名称。

extern "C" {
  void SysTick_Handler(void)
  {
    // do whatever
  }
}

2
谢谢。这与您在示例中编写的完全一样。而且我还可以将头文件中的函数声明为extern“ C” void SysTick_Handler(void); 然后以经典形式编写我的中断处理程序,即不带外部“ C”。
x4mer

哦,我的上帝!谢谢您的出色回答!由于不知道这一点而浪费了很多时间)再次感谢您!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.