什么';irq在ARM系统编程中的作用是什么?

什么';irq在ARM系统编程中的作用是什么?,arm,interrupt,bare-metal,Arm,Interrupt,Bare Metal,据我所知,irq用于定义ARM7(v4)体系结构的中断服务例程功能。但是它对功能有什么改变呢 根据: “Y-Irq”关键字使C或C++函数用作中断例程。 __irq是一个函数限定符。它会影响函数的类型 ARM编译器为使用函数限定符定义的例程提供了什么样的特殊处理 当此属性存在时,编译器生成适合在中断处理程序中使用的函数进入和退出序列 我相信armcc也会这样做,您可以使用objdump查看创建的二进制文件中的差异 从您引用的页面: 所有损坏的寄存器(浮点寄存器除外)都会被保留,而不仅仅是那些通常

据我所知,irq用于定义ARM7(v4)体系结构的中断服务例程功能。但是它对功能有什么改变呢

根据:

“Y-Irq”关键字使C或C++函数用作中断例程。 __irq是一个函数限定符。它会影响函数的类型

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

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

我相信armcc也会这样做,您可以使用
objdump
查看创建的二进制文件中的差异

从您引用的页面:

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


编译器修改函数退出/进入。这意味着调整lr,在返回后更改处理器模式,并保存和恢复通常不在函数调用之间保存的寄存器(通常为r0-r3和r12)。下面是一个简短的例子:

void func()
{
    ...
}
生成的汇编程序:

/* void func() */
    stmfd   sp!, {r4, lr}
    ...
    ldmfd   sp!, {r4, lr}
    bx  lr
与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}^
作为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}^

请注意,确切的寄存器列表还取决于一些外部参数,如ABI。

So\uu irq在从ISR返回时负责(1)恢复上下文和(2)将处理器更改为用户模式。ARM IRQ重新启用怎么样?@PraveenFelix通常,中断控制器硬件在进入时禁用中断,在退出时启用中断-CPU切换到IRQ模式或从IRQ模式切换。(不确定这是否适用于优先级和嵌套中断)。