【问题标题】:ISR syntax with ARM-GCCARM-GCC 的 ISR 语法
【发布时间】:2017-05-30 08:07:02
【问题描述】:

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

__irq void ISRFunc (void);

使用 ARM-GCC,编译时会出现语法错误,我尝试过明显的变体,例如 _irq,但它们都有相同的问题。一些谷歌参考声明您不需要将函数指定为 ISR,即void ISRFunc(...) 也可以工作。但是,我无法让我的程序运行,所以如果有人可以确认(a)是所需的类型说明符 __irq(或等效),以及(b)应该如何避免编译错误。

感谢您提供任何信息。

【问题讨论】:

    标签: gcc syntax arm isr


    【解决方案1】:

    __isrARM 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 更一般是“保存 您在此处使用的内容并在退出时恢复”。

    【讨论】:

    • 谢谢安德烈斯。这是我可以勾选的另一种不确定性!干杯
    • 不客气!不要忘记接受答案:)
    • 我会尽快找到方法!
    • 本网站上的人们通过投票和接受的答案获得声誉。 Here is detailed info on how this is done.
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2013-04-19
    • 2023-03-28
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多