当前位置: 首页 > news >正文

linux stm32mp157 GIC-V2 中断处理过程分析

/* 
** 中断触发时,调用的 handle_arch_irq 入口地址。
** 因为此时,挂接的就是 gic_handle_irq 函数!gic_handle_irq 是个全局函数指针,
** static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
** 它是Linux内核中处理GIC中断的核心函数,响应来自GIC的中断请求,完成中断状态的读取、
** 确认(ACK)、处理(ISR调用)和结束(EOI)的完整生命周期。函数通过循环处理可能存在
** 的多个挂起中断。
** 形参 regs 是 long 类型的数组指针,用于保存CPU切换上下文时刻的CPU寄存器现场数据。
** ARM的GIC-V2架构手册内,对中断ID号段的类型划分如下:
**  0-15    软中断(SGI),核间私有;Software-generated interrupt (SGI) 。
**  16-31   外设私有中断(PPI),核间私有;Private Peripheral Interrupt (PPI) 。
**  32-1019 外设共享中断(SPI),核间共享;Shared Peripheral Interrupt (SPI) 。
**  1020-1023 当前仍被保留的中断编号。
** 
*/
static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
{u32 irqstat, irqnr;/* gic_data 是 struct gic_chip_data 类型的全局数组 */struct gic_chip_data *gic = &gic_data[0];void __iomem *cpu_base = gic_data_cpu_base(gic);/*** 多中断处理​:当多个中断同时到达时,GIC会通过优先级排序依次处理,直到无挂起中断。** 抢占限制​:Linux默认不启用中断抢占,当前中断处理完成后才会响应新中断。** RTOS几乎都是中断抢占的!*/do {/* 读取CPU接口的GICC_IAR(Interrupt Acknowledge Register),该操作会返回当前最高优先级的中断ID,并将该中断状态从Pending转为Active​。 */irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);/* 获得硬中断ID:GICC_IAR_INT_ID_MASK用于过滤保留位,仅保留有效中断号(0-1019) */irqnr = irqstat & GICC_IAR_INT_ID_MASK;/* ​外设中断处理(PPI和SPI:16-1019)​ */if (likely(irqnr > 15 && irqnr < 1020)) {if (static_branch_likely(&supports_deactivate_key))/* EOI操作​:向GICC_EOIR寄存器写入中断ID,通知GIC中断处理完成,状态从Active转为Inactive */writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);isb();/* 路由​对应的ISR:handle_domain_irq通过中断描述符表(gic->domain)找到对应的中断处理函数(ISR)。 */handle_domain_irq(gic->domain, irqnr, regs);continue;}if (irqnr < 16) { /* 软中断处理(SGI:0-15)​ */writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);if (static_branch_likely(&supports_deactivate_key))writel_relaxed(irqstat, cpu_base + GIC_CPU_DEACTIVATE);
#ifdef CONFIG_SMP  /* 若支持多核CPU的协同处理 *//** Ensure any shared data written by the CPU sending* the IPI is read after we've read the ACK register* on the GIC.** Pairs with the write barrier in gic_raise_softirq*/smp_rmb();handle_IPI(irqnr, regs);
#endifcontinue;}break;} while (1);
}

两条路线的对比

这两条路线,最终都执行到了__handle_domain_irq 函数这里来,但是他们传入的参数不同。

实际采纳的路线 gic_handle_irq:

默认路线:

所以得出结论,不支持domain路由机制的旧版本的 linux generic interrupt layer 正如2.6.25版本说的,这种legacy,只是为了向前兼容,会慢慢过度,直到被废弃。

GIC-V3 重要的新特性 Affinity routing

这个比较重要,硬件层面新增了许多实用的特性来支持linux这种操作系统里中断管理层的工作,互相配合,提升性能。 Affinity 有关于实时性的支持。 GIC-V2 不支持 Affinity ,是V3版本后引入的。

​​​​​​​

http://www.xdnf.cn/news/295759.html

相关文章:

  • 三角洲行动-高性能高品质的端手地形和生态技术文章解读
  • 2022年全国青少年信息素养大赛 Python编程挑战赛 小学/初中组 初赛真题答案详细解析
  • 为React组件库引入自动化测试:从零到完善的实践之路
  • 音视频作品:AI生成音乐、短视频的邻接权保护
  • 【day03】简写单词 | dd爱框框 | 除2!
  • AD创建元件符号
  • ERP系统源码,java版ERP管理系统源码,云端ERP
  • 【阿里云大模型高级工程师ACP习题集】2.9 大模型应用生产实践(下篇)
  • BC35 判断字母
  • 预训练到微调:深入理解AI的上下游任务
  • 网络延时 第四次CCF-CSP计算机软件能力认证
  • 41.寻找缺失的第一个正数:原地哈希算法详解
  • pyqt写一个单片机配置界面
  • DockerDesktop替换方案
  • AVL树 和 红黑树 的插入算法
  • 模拟芯片设计中数字信号处理一些常用概念(一)
  • Agent2Agent(谷歌A2A)协议原理讲解
  • Linux 文件系统深度解析
  • (二)MMA(整洁架构)
  • 中阳策略:如何从K线行为中提取交易逻辑信号?
  • spring中spring-boot-configuration-processor的使用
  • wordperss AI插件:AI图文+视频+长尾关键词自动生成,已内置deepseek、kimi全模型,支持简单一键接入更多自定义API
  • 动态规划之子序列问题1
  • n8n中Wait节点的使用详解:流程暂停与恢复的实战指南
  • CodeQL-CLI工具小白入门
  • hp主机安装ubuntu 22.04版本并换阿里源
  • 【Unity】一个AssetBundle热更新的使用小例子
  • n8n 中 Compare Datasets 节点使用详解
  • 怎么使用nacos作注册中心 + 配置中心。
  • PCA降维详解