ARM GIC(二)中断分类

本文详细介绍了中断状态的四个阶段,GIC架构中的中断触发方式(边缘触发和电平触发),以及中断类型如SGI、PPI、SPI和LPI的区别。文章还讨论了中断优先级和中断号的分配,特别提到ARMCPU中PPI的具体分配需参考其TRM。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、中断状态
对于每一个中断而言,有以下4个状态:

inactive:中断处于无效状态

pending:中断处于有效状态,但是cpu没有响应该中断

active:cpu在响应该中断

active and pending:cpu在响应该中断,但是该中断源又发送中断过来

以下是中断状态的转移图。至于图中的转移条件,在gic架构文档中,有介绍。
在这里插入图片描述
二、中断触发方式
中断触发方式,包含以下两种方式:

edge-triggered: 边沿触发,当中断源产生一个边沿,中断有效

level-sensitive:电平触发,当中断源为指定电平,中断有效

三、中断类型
中断类型分为以下几类:
SGI(software-generated interrupts)软件产生的中断,主要用于核间交互,内核中的IPI,inter-processor interrupts就是基于SGI的,中断号ID0 - ID15用于SGI。内核中的 IPI:inter-processor interrupts 就是基于 SGI

PPI:(private peripheral interrupt),私有外设中断,该中断来源于外设,但是该中断只对指定的core有效。

SPI:(shared peripheral interrupt),共享外设中断,该中断来源于外设,但是该中断可以对所有的core有效。

LPI (Locality-specific Peripheral Interrupt):LPI 是 GICv3 中的新特性,它们在很多方面与其他类型的中断不同。LPI 始终是基于消息的中断,它们的配置保存在表中而不是寄存器。比如 PCIe 的 MSI/MSI-x 中断。

四、中断优先级
因为soc中,中断有很多,为了方便对中断的管理,对每个中断,附加了中断优先级。在中断仲裁时,高优先级的中断,会优于低优先级的中断,发送给cpu处理。

当cpu在响应低优先级中断时,如果此时来了高优先级中断,那么高优先级中断会抢占低优先级中断,而被处理器响应。

五、中断号
为了方便对中断的管理,gic为每个中断,分配了一个中断号,也就是interrupt ID。对于中断号,gic也进行了分配:

ID0-ID15,分配给SGI

ID16-ID31,分配给PPI

ID32-ID1019分配给SPI

其他

在具体的arm的cpu中,对于PPI,又进行了详细的分配。这个,就得看arm cpu的TRM了。

### ARM GIC 中断系统结构 ARM通用中断控制器(Generic Interrupt Controller, GIC)ARM架构中的重要组成部分[^1]。其主要功能在于管理和分发来自不同源的中断请求至合适的CPU核心,从而实现高效的中断处理机制。 #### Distributor 和 CPU Interface 组成 GIC内部可以划分为两大逻辑单元:Distributor和CPU接口(CPU Interface)[^2]。前者负责接收并优先级排序外部设备发出的中断信号;后者则连接着各个处理器内核,用于传递已选定需响应的具体中断事件给目标CPU。 ### 工作原理 当有新的中断到来时,首先由Distributor对其进行初步筛选与排列顺序,依据预先设定好的规则决定哪些应该被激活并向下游发送通知。对于共享外围组件互联(Shared Peripheral Interrupts, SPI),允许指定特定的一组或多组CPU来共同承担该类别的服务职责,以此达到负载均衡的效果,在多核环境中尤为重要[^3]。 一旦确定好接受者列表后,相应的消息就会通过各自的CPU接口传达出去。值得注意的是,在某些情况下还可以设置独占模式下的私有快速中断(PPI),它们只会触发单个关联的核心而不会影响其他成员。 ### 配置过程概述 在实际应用过程中,为了使能整个GIC框架正常运作,必须经历一系列必要的初始化步骤: - **硬件资源准备**:确保所有涉及的寄存器地址空间已被正确映射,并且能够访问到物理层面的操作权限。 - **IRQ映射创建**:动态地为每一个待使用的HW IRQ编号分配虚拟表示(Virtual IRQ Number),建立起两者间的双向联系表项。这项任务通常是在首次尝试引用某具体位置之前完成的[^4]。 - **参数调整优化**:针对不同的应用场景需求,可能还需要进一步微调诸如优先级别、敏感度阈值之类的属性配置选项,以满足最佳性能表现的要求。 ```c // 示例代码片段展示如何查询当前系统的最大支持SPI数量 #include <linux/of.h> #include <linux/irqdomain.h> static int __init gic_max_spi_init(void){ struct device_node *np; np = of_find_compatible_node(NULL, NULL, "arm,gic"); if (!np) return -ENODEV; printk(KERN_INFO "Max SPI number supported by this system is %d\n", irq_domain_get_irq_count(np)-16); // 减去PPI数目得到纯SPI计数 of_node_put(np); return 0; } module_init(gic_max_spi_init); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值