Web上用于定义ARM的ISR的演示代码通常是这样的:
__irq void ISRFunc (void);
使用ARM-GCC,这会在编译时出现语法错误,我尝试过像_irq
这样的明显变体,但它们都有同样的问题。一些Google引用声明您不需要将该功能指定为ISR,即void ISRFunc(...)
也可以使用。但是,我无法让我的程序运行,所以如果有人确认(a)是所需的类型说明符__irq
(或等效的),并且(b)它应该是什么,它将会有很大帮助是为了避免编译错误。
感谢您提供任何信息。
答案 0 :(得分:3)
__isr
是ARM C compiler specific关键字(看起来像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
更像是一般的“保存”
你在这里使用什么,并在退出“。