ARM通用中断控制器GIC之中断处理状态机 Interrupt handling state machine

中断有四种状态:inactive,pending,active 和active and pending。而产生中断的方式有两种,一种是通过写pending寄存器,让中断进入pending状态,可以忽略是否真的有物理中断信号,让Distributor将该中断转发到对应CPU interface。

  • 对于SGI中断,可以通过写入GICD_SGIR寄存器和GICD_SPENDSGIRn寄存器来产生。
  • 对于外设中断,它可以通过硬件产生物理信号到GIC,也可以通过写入GICD_ISPENDRn寄存器来产生中断。
    此外,ARM GIC在CPU interface中,为每个所支持的中断都维护了一个状态机,下图为该状态机的示意图以及转换关系:
    Interrupt handling state machine
    当Distributor的中断转发功能以及CPU interface的中断信号发送功能使能,中断状态的转换如下:

A1和A2:转换/增加到pending状态

  • 对于SGI中断,如果软件写入GICD_SGIR寄存器指定了目标处理器,或着目标寄存器的软件写入GICD_SPENDESGIRn寄存器的源处理器和中断ID等对应字段。
  • 对于SPI和PPI中断,如果外设发出了中断信号,或者软件上写入了一个GICD_ISPENDR寄存器。

B1和B2:移除pending状态

  • 对于SGI,会发生在对应目标处理器的软件写入寄存器GICD_CPENDSGIRn的对应bit
  • 对于SPI和PPI,如果是电平敏感的中断,如果该中断的pending状态是由于输入的物理中断信号,当该信号被解除断言时,pending状态将会被移除。如果是边沿触发的中断,如果该中断是由于输入的物理边缘触发中断信号,或者是写入GICD_ISPENDRn寄存器造成的pending,如果可以通过写入GICD_ICPENDRn寄存器来解除pending状态。

C:从pending转到active

如果中断被使能,并且有足够的优先级,被CPU interface发送给处理器后,软件读取GICC_IAR寄存后,该中断将从pending状态转为active。

D:从pending状态转为active and pending:

  • 对于SGI中断,如果写入寄存器来设置SGI的pending状态和读取GICC_IAR寄存器几乎发生在同时,或者当有两个或者更多的相同中断ID的SGI中断从同一个源处理器发送到同一个目标处理器时,如果其中一个SGI走 C 转换方式,则其余的SGI中断就走D转换方式。
  • 对于PPI和SPI中断:如果当前中断被使能,软件读取GICC_IAR寄存器,这个读取动作将会添加active状态。此外,适用以下条件之一:
      • 对于电平敏感中断,中断信号保持断言。通常是这样,因为在处理器在处理完中断之前,外围设备不会解除对中断的断言。对于一个边缘触发的中断,这种转换是否发生取决于GICC_IAR的读取的时间相对于检测中断的重新断言的时间。否则,GICC_IAR的读取将导致转换C,也可能是转换A2。

转换 E1和E2,移除中断状态

发生在软件通过写入r GICC_EOIR 和 GICC_DIR寄存器来使中断失活。

一种中断的持续时间取决于它被配置为电平敏感还是边沿敏感:

对于电平敏感,中断输入的上升沿会导致中断被pending,并且这个中断会被一直hold直到外设将这个中断信号拉低
对于边沿敏感,中断输入的上升沿会导致中断被pending,但是这个中断不会被hold

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值