1

我了解__irq用于为 ARM7(v4) 架构定义中断服务程序功能。但是它对功能有什么改变呢?

根据ARM 信息中心

__irq 关键字允许将 C 或 C++ 函数用作中断例程。__irq 是一个函数限定符。它影响函数的类型。

ARM 编译器对使用__irq函数限定符定义的例程提供了什么样的特殊处理?

4

2 回答 2

2

The compiler modifies the function exit/entry. This means adjusting lr, changing processor mode after return and saving & restoring registers that are not normally saved across function calls (normally r0-r3 and r12). Here is a short example:

void func()
{
    ...
}

Generated Assembler:

/* void func() */
    stmfd   sp!, {r4, lr}
    ...
    ldmfd   sp!, {r4, lr}
    bx  lr

Same function as IRQ:

/* void __attribute__ ((interrupt ("IRQ"))) func() */
    sub lr, lr, #4
    stmfd   sp!, {r0, r1, r2, r3, r4, r5, ip, lr}
    ...
    ldmfd   sp!, {r0, r1, r2, r3, r4, r5, ip, pc}^

And as FIQ:

/* void __attribute__ ((interrupt ("FIQ"))) func() */
    sub lr, lr, #4
    stmfd   sp!, {r0, r1, r2, r3, r4, lr}
    ...
    ldmfd   sp!, {r0, r1, r2, r3, r4, pc}^

Note that the exact register list also depends on some external parameters such as the ABI.

于 2013-02-04T21:35:24.490 回答
1

来自gcc 手册

当此属性存在时,编译器生成适用于中断处理程序的函数进入和退出序列。

我相信 armcc 也是如此,您可以使用它objdump来查看创建的二进制文件中的差异。

从您引用的页面:

除浮点寄存器外的所有损坏的寄存器都将被保留,而不仅仅是那些通常在 AAPCS 下保留的寄存器。必须使用默认的 AAPCS 模式。

于 2013-02-04T17:23:59.167 回答