将 Weak ISR Handler 从 Assembly 覆盖到 C++ 不会编译任何代码

Overriding Weak ISR Handler from Assembly to C++ doesn't compile any code

我正在使用 IDE SEGGER Studio 在基于 ARM 32 位的 SAM D51 微处理器上编写嵌入式编程代码。我是嵌入式编程的新手,正在编写我的第一个中断。

带有虚拟处理程序的向量 table 是用 ARM 程序集编写的,这是一个示例,以下代码是在项目创建时自动生成的,但标记为弱,因此可以在 C/C++

  ldr r0, =__stack_end__
  mov sp, r0
  bl SystemInit
  b _start

  .thumb_func
  .weak SystemInit
SystemInit:
  bx lr

我在网上看到的任何地方都说只需添加一个具有相同名称的 C/C++ 函数,链接器就神奇地使用了它,因为它没有被标记为弱函数。下面是我覆盖它的地方。

void SystemInit()
{
  printf("Here");
}

然而,调试器声明它不能在那里放置断点,因为没有代码,并且在反汇编程序中它显示整个函数已经变成没有代码的注释。

我已经尝试过其他函数,包括许多处理程序函数,但它们都做完全相同的事情,我不知道为什么。

我什至尝试过向前声明一个弱函数,然后覆盖它或将函数标记为易变的。这是我最近的尝试,但结果相同:

extern void __attribute__((weak)) SystemInit();

void SystemInit()
{
  printf("Here");
}

又一次尝试

volatile void SystemInit()
{
  printf("Here");
}

它们都以没有为该函数生成代码而结束,它在反汇编中显示为注释。

C++ 源文件中的标识符的名称被破坏了。生成的链接器函数名称不同于 SystemInit。要阻止 C++ 编译器破坏函数名称,请使用 extern "C" 声明该函数。这样生成的函数名称将与链接器期望的函数名称相匹配。