GIC 中断 Active 状态的配置

在ARMv8/ARMv9 体系结构中,GICD_ISACTIVER<n>GICD_ICACTIVER<n> 是通用中断控制器(GIC)的两组寄存器,它们用于管理特定中断的活动状态。这些寄存器允许软件查询和修改中断是否处于活动状态。

在这里插入图片描述

中断状态分类

在ARM体系中,对于每个中断,有四个状态:

  • inactive:中断处于无效状态;
  • pending:中断处于有效状态,但是CPU没有响应该中断;
  • active:中断处于有效状态,CPU在响应该中断;
  • active and pending:CPU在响应该中断,但是该中断源又发送中断过来。

GICD_ISACTIVER

  • 寄存器名称:Interrupt Set-Active Registers
  • 目的:用于将特定的中断标记为活动状态。
  • 描述GICD_ISACTIVER<n> 寄存器允许软件将中断设置为活动状态。当向这些寄存器的特定位写入 1 时,对应的中断会被标记为活动状态。写入 0 到这些位没有影响。

GICD_ICACTIVER

  • 寄存器名称:Interrupt Clear-Active Registers
  • 目的:用于清除特定中断的活动状态。
  • 描述GICD_ICACTIVER<n> 寄存器允许软件清除中断的活动状态。当向这些寄存器的特定位写入 1 时,对应的中断活动状态会被清除。写入 0 到这些位没有影响。

参数 n 编号解释

参数 <n> 表示寄存器索引,根据系统支持的中断数量而变化。例如,如果GIC支持最多1020个SPI(共享外设中断),则 GICD_ISACTIVERGICD_ICACTIVER 寄存器会有多个(例如从 GICD_ISACTIVER0GICD_ISACTIVER31),因为每个寄存器可以控制32个中断的活动状态。

中断设置举例

假设我们要将中断ID 68标记为活动状态,然后清除其活动状态:

设置中断ID 68为活动状态
  1. 确定正确的寄存器和位位置:
    • 中断ID 68 位于 GICD_ISACTIVER2 (因为 68 / 32 = 2),位于该寄存器的第 68 % 32 = 4 位。
  2. 设置为活动:
    GICD_ISACTIVER2 = (1 << 4);
    
清除中断ID 68的活动状态
  1. 同样,位于 GICD_ICACTIVER2 寄存器,位位置为第 4 位。
  2. 清除活动状态:
    GICD_ICACTIVER2 = (1 << 4);
    

小结

  • 实际使用时,通常不需要手动设置或清除中断的活动状态,因为GIC硬件会自动管理这些状态。手动修改这些状态可能会导致系统行为异常。
  • 操作这些寄存器通常需要特权级别的代码执行,因此操作通常在操作系统内核或相应的驱动程序中进行。
  • 标记中断为“ACTIVE状态后并不会启动中断处理程序的执行。它仅仅表示该中断正被处理或等待处理。中断的启动依赖于中断的使能状态和优先级配置。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部