我了解__irq用于为 ARM7(v4) 架构定义中断服务程序功能。但是它对功能有什么改变呢?
根据ARM 信息中心:
__irq 关键字允许将 C 或 C++ 函数用作中断例程。__irq 是一个函数限定符。它影响函数的类型。
ARM 编译器对使用__irq函数限定符定义的例程提供了什么样的特殊处理?
我了解__irq用于为 ARM7(v4) 架构定义中断服务程序功能。但是它对功能有什么改变呢?
根据ARM 信息中心:
__irq 关键字允许将 C 或 C++ 函数用作中断例程。__irq 是一个函数限定符。它影响函数的类型。
ARM 编译器对使用__irq函数限定符定义的例程提供了什么样的特殊处理?
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.
来自gcc 手册
当此属性存在时,编译器生成适用于中断处理程序的函数进入和退出序列。
我相信 armcc 也是如此,您可以使用它objdump
来查看创建的二进制文件中的差异。
从您引用的页面:
除浮点寄存器外的所有损坏的寄存器都将被保留,而不仅仅是那些通常在 AAPCS 下保留的寄存器。必须使用默认的 AAPCS 模式。