【ARMv7-A】——IRQ 和 FIQ 异常中断处理程序的返回

文章目录

    • 处理流程
    • 示例
    • 代码实现
      • 不支持中断嵌套
      • 支持中断嵌套
      • C 语言执行中断服务函数
    • 附录源码

处理流程

通常处理器执行完当前指令后,查询 IRQ 中断引脚及 FIQ 中断引脚,并且查看系统是否允许 IRQ 中断及 FIQ中断。
如果有中断引脚有效,并且系统允许该中断产生,处理器将产生 IRQ 异常中断或 FIQ 异常中断。
当 IRQ 和 FIQ 异常中断产生时,程序计数器 PC 的值已经更新,它指向当前指令后面第 3 条指令(对于 ARM 系统来说它指向当前指令地址加 12 个字节的位置,对于 Thumb 指令来说,它指向当前指令加 6 个字节的位置)。
当 IRQ 和 FIQ 异常中断发生时,处理器将 PC-4 的值保存到异常模式下的寄存器 LR_mode 中,这时 LR_mode 中的值即为PC-4 ,即指向当前指令后的第二条指令。因此返回操作需要将 LR_mode - 4(指向当前指令的下一条指令) 赋给 PC,可以通过下面的指令来实现:

SUBS PC, LR, #4  // 注意 S ,指定了 S 意味着同时将SPSR 拷贝到 CPSR

该指令将寄存器 LR 中的值减 4 后,复制到程序计数器 PC 中,实现程序返回,同时将 SPSR_mode 寄存器内容复制到 CPSR 中。
当异常中断处理程序中使用了数据栈时,可以通过下面的指令在异常中断处理程序时保存被中

你可能感兴趣的:(ARM,体系结构与编程,arm,irq,fiq)