将弱 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