GCC链接器丢弃中断处理程序

GCC链接器丢弃中断处理程序,c,linker,arm,embedded,microcontroller,C,Linker,Arm,Embedded,Microcontroller,调试应用程序时,发现ISR从未真正进入,我检查了.map文件,发现处理程序函数位于“丢弃的输入部分”,是否有办法强制链接器不这样做?我确信这是链接器的问题,因为我没有启用任何优化。这不是链接器的问题。这意味着编译器不理解该函数是ISR,但认为它是正常函数。不调用的普通函数不会被链接,不管优化器设置如何(或者我们最终会将整个标准库链接到二进制文件等) 如何在gcc中声明ISR往往是特定于端口的,通常您可以按照以下步骤进行: 其中字符串部分是特定于MCU的。您的特定MCU工具链应该记录您应该使用的特

调试应用程序时,发现ISR从未真正进入,我检查了.map文件,发现处理程序函数位于“丢弃的输入部分”,是否有办法强制链接器不这样做?我确信这是链接器的问题,因为我没有启用任何优化。

这不是链接器的问题。这意味着编译器不理解该函数是ISR,但认为它是正常函数。不调用的普通函数不会被链接,不管优化器设置如何(或者我们最终会将整个标准库链接到二进制文件等)

如何在gcc中声明ISR往往是特定于端口的,通常您可以按照以下步骤进行:


其中字符串部分是特定于MCU的。您的特定MCU工具链应该记录您应该使用的特定名称

我想你需要一个属性。这是什么类型的嵌入式手臂?a-m?您特别希望它是一个普通(非静态)函数,没有特殊的编译器特定属性。如果它不是cortex-m,那么它确实需要被包装,但是链接器在没有包装器的情况下不会像任何其他文件中的任何其他函数一样随意丢弃它。如果是cortex-m,那么您希望它是一个普通函数,假设编译器使用了正确的abi。对于gcc,你想让它单独存在。如果不在库中,则未调用的全局函数将与gnu工具链链接。在这种情况下,无论如何都会有一个指向vector/exception表的链接。
void f () __attribute__ ((interrupt ("IRQ")));