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) 什么应该是为了避免编译错误。
感谢您提供任何信息。
__isr
是 ARM 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
更一般的“保存
您在此处使用的内容并在退出时恢复。
网上为ARM定义ISR的demo代码一般是这样的:
__irq void ISRFunc (void);
使用 ARM-GCC,这会在编译时产生语法错误,我已经尝试过像 _irq
这样明显的变体,但它们都有同样的问题。一些 google 参考声明您不需要将函数指定为 ISR,即 void ISRFunc(...)
也可以。但是,我在将我的程序设置为 运行 时遇到了问题,因此如果有人可以确认 (a) 是所需的类型说明符 __irq
(或等效项),以及 (b) 什么应该是为了避免编译错误。
感谢您提供任何信息。
__isr
是 ARM 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
更一般的“保存
您在此处使用的内容并在退出时恢复。