【发布时间】: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 和非常快速的响应。