将弱 ISR 处理程序从 Assembly 覆盖到 C++ 不会编译任何代码

Posted

技术标签:

【中文标题】将弱 ISR 处理程序从 Assembly 覆盖到 C++ 不会编译任何代码【英文标题】:Overriding Weak ISR Handler from Assembly to C++ doesn't compile any code 【发布时间】:2019-09-07 13:16:49 【问题描述】:

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

带有虚拟处理程序的向量表是用 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");

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

【问题讨论】:

extern "C" ! 哇,我在学习 C++ 的时候到处都看到过 extern "C",但我不知道它做了什么,所以我从来没有研究过。只要我在函数之前添加它,它现在就可以工作了。非常感谢@KamilCuk 和非常快速的响应。 【参考方案1】:

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

【讨论】:

感谢您的帮助,这就是答案。

以上是关于将弱 ISR 处理程序从 Assembly 覆盖到 C++ 不会编译任何代码的主要内容,如果未能解决你的问题,请参考以下文章

VxWorks 6.9 内核编程指导之读书笔记 -- ISRs和Watchdog Timer

远程处理:从服务器 AppDomain 查找客户端 AppDomain / Assembly

将弱关系映射到 ORM

ISR中断服务程序

将弱符号和局部符号链接在一起时,可能的 GCC 链接器错误会导致错误

如何将弱引用对象存储在数组中,字典中的objc?