文章目录
- GIC 中断 Active 状态的配置
- 中断状态分类
- GICD_ISACTIVER<n>
- GICD_ICACTIVER<n>
- 参数 n 编号解释
- 中断设置举例
- 设置中断ID 68为活动状态
- 清除中断ID 68的活动状态
- 小结
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_ISACTIVER
和 GICD_ICACTIVER
寄存器会有多个(例如从 GICD_ISACTIVER0
到 GICD_ISACTIVER31
),因为每个寄存器可以控制32个中断的活动状态。
中断设置举例
假设我们要将中断ID 68标记为活动状态,然后清除其活动状态:
设置中断ID 68为活动状态
- 确定正确的寄存器和位位置:
- 中断ID 68 位于
GICD_ISACTIVER2
(因为68 / 32 = 2
),位于该寄存器的第68 % 32 = 4
位。
- 中断ID 68 位于
- 设置为活动:
GICD_ISACTIVER2 = (1 << 4);
清除中断ID 68的活动状态
- 同样,位于
GICD_ICACTIVER2
寄存器,位位置为第 4 位。 - 清除活动状态:
GICD_ICACTIVER2 = (1 << 4);
小结
- 实际使用时,通常不需要手动设置或清除中断的活动状态,因为GIC硬件会自动管理这些状态。手动修改这些状态可能会导致系统行为异常。
- 操作这些寄存器通常需要特权级别的代码执行,因此操作通常在操作系统内核或相应的驱动程序中进行。
- 标记中断为“ACTIVE”状态后并不会启动中断处理程序的执行。它仅仅表示该中断正被处理或等待处理。中断的启动依赖于中断的使能状态和优先级配置。