ARM 通用中断控制器GIC(Generic Interrupt Controller)
ARM 通用中断控制器GICGeneric Interrupt Controller1. 为什么需要GIC在ARM多核处理器系统中外设中断源可能多达数百个而CPU核数量有限。如果每个中断直接连到CPU会产生两个问题 - 中断线路资源不足CPU引脚有限 - 无法实现中断优先级仲裁、CPU间中断路由等高级功能 GIC作为ARM架构标准的中断控制器解决了这些问题。它负责 - 收集所有中断源 - 按优先级分发到指定CPU核 - 支持中断屏蔽、嵌套、虚拟化扩展 ### 2. GIC的硬件架构GIC逻辑上分为两个主要单元 -Distributor (GICD)管理所有中断源的使能、优先级、目标CPU路由 -CPU Interface (GICC)每个CPU核一个负责向核内发送中断信号并处理应答 中断类型分为 - SGI (Software Generated Interrupt)核间通信通过写寄存器触发 - PPI (Private Peripheral Interrupt)私有外设中断每个核独立 - SPI (Shared Peripheral Interrupt)共享外设中断可路由到任意核 ### 3. GIC寄存器操作实战C代码以下代码演示如何在Linux内核模块中操作GIC寄存器基于GICv3使用系统寄存器访问c#include linux/kernel.h#include linux/module.h#include linux/io.h#include asm/sysreg.h// GICv3 CPU接口系统寄存器定义#define ICC_IAR1_EL1 sys_reg(3, 0, 12, 12, 0) // 中断应答寄存器#define ICC_EOIR1_EL1 sys_reg(3, 0, 12, 12, 1) // 中断结束寄存器#define ICC_PMR_EL1 sys_reg(3, 0, 4, 6, 0) // 优先级掩码寄存器static u32 gic_read_iar(void) { u64 val; asm volatile(mrs %0, __stringify(ICC_IAR1_EL1) : r (val)); return (u32)val 0xFFFFFF; // 低24位为中断ID}static void gic_write_eoi(u32 irq) { asm volatile(msr __stringify(ICC_EOIR1_EL1) , %0 :: r ((u64)irq));}static void gic_set_priority_mask(u8 priority) { asm volatile(msr __stringify(ICC_PMR_EL1) , %0 :: r ((u64)priority));}static int __init gic_demo_init(void) { u32 irq; // 设置优先级掩码允许所有中断0xFF表示最低优先级 gic_set_priority_mask(0xFF); // 模拟等待中断实际应配合异常向量表 pr_info(GIC demo: waiting for interrupt...\n); // 读取当前中断若无中断返回1023表示空闲 irq gic_read_iar(); pr_info(GIC demo: received IRQ %u\n, irq); // 处理完毕后必须写EOI寄存器 if (irq 1023) { gic_write_eoi(irq); pr_info(GIC demo: completed IRQ %u\n, irq); } return 0;}module_init(gic_demo_init);MODULE_LICENSE(GPL);### 4. 中断路由配置实战Python模拟由于直接操作硬件需要特权级这里用Python模拟GICD路由寄存器配置逻辑python#!/usr/bin/env python3# 模拟GICD_ROUTER寄存器GICv3为每个SPI配置路由# 寄存器布局每个SPI占64位低32位为CPU掩码高32位为配置class GICDistributor: def __init__(self, num_spis128): self.router {} # 存储每个SPI的路由配置 self.enabled {} # 使能状态 self.priority {} # 优先级0-255 def configure_spi(self, spi_id, cpu_mask, priority, enableTrue): 配置SPI中断路由 if spi_id 32 or spi_id 32 self.num_spis: raise ValueError(fInvalid SPI ID: {spi_id}) # 构建路由寄存器值模拟硬件寄存器 router_value (cpu_mask 0xFFFFFFFF) | (priority 32) self.router[spi_id] router_value self.enabled[spi_id] enable self.priority[spi_id] priority print(f[GICD] Configured SPI{spi_id}: CPU mask0x{cpu_mask:08X}, fpriority{priority}, enabled{enable}) def route_interrupt(self, spi_id, current_cpu): 根据路由配置决定中断送到哪个CPU if not self.enabled.get(spi_id, False): print(f[GICD] SPI{spi_id} disabled, ignored) return None mask self.router[spi_id] 0xFFFFFFFF if mask (1 current_cpu): print(f[GICD] Routing SPI{spi_id} to CPU{current_cpu}) return current_cpu else: # 简单轮询找第一个可用的CPU for cpu in range(4): if mask (1 cpu): print(f[GICD] Routing SPI{spi_id} to CPU{cpu}) return cpu return None# 使用示例gic GICDistributor(num_spis64)# 配置SPI 45路由到CPU0和CPU2高优先级0使能gic.configure_spi(45, 0b0101, 0, True)# 配置SPI 50仅路由到CPU3低优先级200gic.configure_spi(50, 0b1000, 200, True)# 模拟CPU1收到中断请求target gic.route_interrupt(45, current_cpu1)print(fInterrupt 45 - CPU{target})# 禁用SPI 50后测试gic.enabled[50] Falsetarget gic.route_interrupt(50, current_cpu3)print(fInterrupt 50 - {target})### 5. 中断处理流程与性能优化实际中断处理需遵循严格流程1.硬件阶段外设触发中断 → GICD按优先级选择最高中断 → GICC向CPU核发送IRQ信号 2.软件阶段Linux内核示例c // 中断处理函数顶半部 static irqreturn_t my_handler(int irq, void *dev_id) { // 读取硬件寄存器确认中断源 uint32_t status readl(reg_base STATUS_REG); // 处理中断快速操作 return IRQ_WAKE_THREAD; // 唤醒底半部线程 } // 底半部线程函数 static irqreturn_t my_thread_fn(int irq, void *dev_id) { // 慢速操作如数据拷贝、唤醒进程 wake_up_interruptible(wait_queue); return IRQ_HANDLED; }3.性能要点 - 使用IRQF_DISABLED慎用会禁用所有中断 - 顶半部保持极短执行时间 - 合理设置优先级避免优先级反转 - 多核系统使用irq_set_affinity绑定CPU### 6. 调试技巧bash# 查看系统中断分布cat /proc/interrupts# 查看GIC相关内核日志dmesg | grep -i gic# 使用perf跟踪中断延迟perf sched record -- sleep 1perf sched latency --sort max### 总结GIC是现代ARM多核系统的关键组件它抽象了中断管理的复杂性。本文从硬件架构、寄存器操作、路由配置到性能优化提供了完整实战演示。实际开发中需注意- GICv2和GICv3在寄存器访问方式上差异很大内存映射vs系统寄存器- 中断处理必须严格遵循读取IAR→处理→写入EOI的时序- 多核环境下的中断亲和性设置直接影响系统性能掌握GIC的核心原理能帮助你高效调试中断相关的问题并为编写高性能设备驱动打下坚实基础。建议进一步阅读ARM官方《ARM Generic Interrupt Controller Architecture Specification》获取更细节的规范。

相关新闻

3DS游戏存档备份神器:JKSM完整使用指南,让你的游戏记忆永不丢失!

3DS游戏存档备份神器:JKSM完整使用指南,让你的游戏记忆永不丢失!

3DS游戏存档备份神器:JKSM完整使用指南,让你的游戏记忆永不丢失! 【免费下载链接】JKSM JKs Save Manager for 3DS 项目地址: https://gitcode.com/gh_mirrors/jk/JKSM 你是否曾因3DS系统故障、SD卡损坏或意外操作而丢失了数百小时的游…

2026/10/19 5:11:49 阅读更多 →
STM32H750驱动7寸电容屏:SPI DMA与GT911触摸实战指南

STM32H750驱动7寸电容屏:SPI DMA与GT911触摸实战指南

1. 项目概述:一块7英寸电容触摸屏的深度探索最近在折腾一个需要人机交互的项目,选型时一眼看中了市面上很常见的那种7英寸电容触摸LCD屏。这类屏幕通常指的是那种集成了LCD显示面板和电容式触摸控制器(常见如GT811或GT911)的一体化…

2026/10/19 5:12:13 阅读更多 →
如何突破声码器断音瓶颈:NSF-HIFIGAN架构革新与谐波正弦优化

如何突破声码器断音瓶颈:NSF-HIFIGAN架构革新与谐波正弦优化

如何突破声码器断音瓶颈:NSF-HIFIGAN架构革新与谐波正弦优化 【免费下载链接】so-vits-svc SoftVC VITS Singing Voice Conversion 项目地址: https://gitcode.com/gh_mirrors/so/so-vits-svc 在AI语音合成领域,声码器断音问题是长期困扰技术决策…

2026/10/17 13:51:51 阅读更多 →

最新新闻

多跳WSNs中抵御窃听与硬件噪声的物理层安全路径选择

多跳WSNs中抵御窃听与硬件噪声的物理层安全路径选择

做无线传感器网络仿真的朋友应该都有这种感觉:协议栈没调通的时候,最愁的是数据传不出去;好不容易把网络调通、数据能传了,下一个更要命的问题就来了——传出去的数据到底安不安全,尤其当信道里潜伏着窃听者&#xff0…

2026/10/19 5:12:13 阅读更多 →
鸿蒙自研RcList列表组件:全局配置与状态管理架构详解

鸿蒙自研RcList列表组件:全局配置与状态管理架构详解

1. 为什么我花了半年时间自研一套 List 组件先说结论:官方列表组件在复杂业务场景下,配置管理与样式复用的成本会随着页面数量线性膨胀,最终变成一个没人敢动的巨型状态集合。我接手某跨平台系统的核心列表页时,页面数量接近 40 个…

2026/10/19 5:12:13 阅读更多 →
开源代码评审工具实战:从部署到团队落地的完整指南

开源代码评审工具实战:从部署到团队落地的完整指南

代码评审这件事,我做了快十年,从最早用邮件发diff给人肉挑错,到后来上Gerrit强制review,再到现在团队里重度依赖自动化评审辅助工具。说实话,真正把“代码评审”从流程包袱变成开发效率助推器的转折点,就是…

2026/10/19 5:12:13 阅读更多 →
代码评审不是找茬:从被骂惨到整改,编程规范才是代码可维护的底线

代码评审不是找茬:从被骂惨到整改,编程规范才是代码可维护的底线

前天晚上十一点,我收到一条消息。不是女朋友发的,是领导把代码评审链接甩进项目群,配了一句:“你自己看看你提交了什么,别人怎么看?”点开链接,我的提交下面挂了二十多条评论。最狠的一条不是批…

2026/10/19 5:12:13 阅读更多 →
LDA线性判别分析:分类聚团式降维,你该了解的PCA替代方案

LDA线性判别分析:分类聚团式降维,你该了解的PCA替代方案

1. 为什么说到降维,大家总是先想起PCA而忘了LDA1.1 我那次用PCA做分类预处理栽的跟头先说一个我自己的经历。某次做一个图像分类的小项目,特征工程做完之后特征维度到了好几百,模型训练慢不说,过拟合也明显。当时脑子里的第一反应…

2026/10/19 5:12:13 阅读更多 →
Xcode调试外部可执行程序:LLDB附加与符号断点实战

Xcode调试外部可执行程序:LLDB附加与符号断点实战

1. 为什么“调试可执行程序”这件事值得单独拎出来讲很多人第一次接触 Xcode 调试,都是从“点一下 Run,断点停住,看变量”开始的。这套流程在普通 App 开发里确实够用,但一旦你面对的不是一个标准的 iOS App 工程,而是…

2026/10/19 5:11:13 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →