ARM-GCC 的 ISR 语法

ISR syntax with ARM-GCC

网上为ARM定义ISR的demo代码一般是这样的:

__irq void ISRFunc (void);

使用 ARM-GCC,这会在编译时产生语法错误,我已经尝试过像 _irq 这样明显的变体,但它们都有同样的问题。一些 google 参考声明您不需要将函数指定为 ISR,即 void ISRFunc(...) 也可以。但是,我在将我的程序设置为 运行 时遇到了问题,因此如果有人可以确认 (a) 是所需的类型说明符 __irq(或等效项),以及 (b) 什么应该是为了避免编译错误。

感谢您提供任何信息。

__isrARM C compiler specific keyword (and looks like it was Keil specific too,但已过时),并且不会通过 GCC 编译。

根据GCC documentation,声明ARM中断服务程序的语法如下:

void __attribute__((interrupt("IRQ"))) do_irq()
{
    //your irq service code goes here
}

额外的细节:

事实上,您可以使用以下任何方式通知编译器您的函数是中断处理程序。

void __attribute__((interrupt)) ...
void __attribute__((interrupt("FIQ"))) ...
void __attribute__((interrupt("IRQ"))) ...

区别在于"IRQ""FIQ"都应该切换寄存器上下文并保存某些 寄存器("FIQ" 什么都不堆),而普通的 interrupt 更一般的“保存 您在此处使用的内容并在退出时恢复。