将 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"
声明该函数。这样生成的函数名称将与链接器期望的函数名称相匹配。
我正在使用 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"
声明该函数。这样生成的函数名称将与链接器期望的函数名称相匹配。