中断控制器是一种集成电路,可以帮助微处理器或CPU处理来自多个不同源(如外部I / O设备)中断请求(Interrupt Request,以下简称IRQ),这些中断请求可能同时发生。确定中断控制器有助于确定 IRQ 为了CPU在得到 IRQ 相对优先评估结果后,切换到最合适的中断处理程序 (InterruptServiceRoutine,以下简称ISR)。
当前市面上主流的芯片架构通常采用不同的中断控制器:

▲表1主流芯片架构及中断控制器
01.
从I/O接收中断信号并传递给CPU,屏蔽中断,控制中断优先级等功能。Intel8259是典型的早期可编程中断控制器 (Programmable Interrupt Controller,以下简称PIC),于 1976 年作为IntelMCS 85 家庭成员推出,专为Intel8085 和Intel8086 设计有微处理器。后来的Intel 8259A(后简称8259A)版本向上兼容,可与8086或8088处理器一起使用。现代 PC 已开始逐步淘汰 8259A,转而采用Intel高级可编程中断控制器 (Advanced Programmable Interrupt Controller,以下简称APIC)架构。虽然不再是单独的芯片,但8259A接口在现代仍然存在x86主板上的平台控制器集线器或南桥芯片组。
▲图1Intel 8259 实物图
▲图2 Intel8259引脚图
- 中断引脚IRQ0-IRQ7.接收外部设备产生一个或多个中断;
- 请求寄存器中断IRR,置位请求寄存器中断位;
- 中断服务寄存器ISR,位置中断寄存器位,表示目前正在处理的中断;
- 优先处理,当多个中断同时触发时,判断优先处理的中断;
- 屏蔽特定的中断;
- INT引脚与CPU触发中断引脚连接CPU中断;
- 数据通道D0-D7.发送中断向量CPU。
早期ARM核心,如ARM7TDMI-S,向量中断控制器通常使用(Vectored Interrupt Controller,以下简称VIC)来管理中断,最多可处理32个中断请求,并且将中断通过IRQ和FIQ传递。
▲图3ARM7TDMI-SVIC示意图
恩智浦基于ARM7TDMI-S开发了32个架构RISC微控制器LPC2148。LPC2148使用ARM PrimeCell(PL向量中断控制器管理中断,PL190通过AHB总线与ARM内核连接。
▲图4PL190VIC示意图
- 请求快速中断(Fast InterruptQequest,以下简称FIQ),最高优先级;
- 向量IRQ(Vectored IRQ,以下简称VIRQ),中等优先;
- 非向量 IRQ(Nonvectored IRQ,以下简称NVIRQ),最低优先级;
对于FIQ,大多数情况下,只分配一个中断,VIC 提供 ISR 若将多个中断分配给地址。 FIQ,VIC 合并所有地址,生成 VICFIQ,为所有 FIQ(非向量 FIQ)仅提供一个 ISR 地址。
对于VIRQ和NVIRQ,任何中断源都可以设置为VIRQ和NVIRQ。NVIRQ与VIRQ区别在于,NVIRQ服务程序地址不能为每个中断源设置,而是所有NVIRQ中断共享相同的服务程序入口地址。当多个中断源被设置为NVIRQ中断时,需要在用户程序中识别中断源并单独处理,因此非向量IRQ中断响应延迟相对较长。如图所示:
▲图5 处理过程中断向量
阶段1:当发生异常时,当前指令流将停止,处理器将访问异常向量表。
阶段2:从向量表中加载异常向量地址。
阶段3:异常处理程序开始在处理程序模式下执行。
阶段4:异常处理程序返回 main(假设没有进一步的嵌套)。
02.
为进一步提高重要中断响应的实时性,ARM基于任务优先级基础的实时操作系统抢占机制,使优先级更高的中断能够抢占当前中断。ARM CPU使用嵌套向量中断控制器(Nested Vectored Interrupt Controller,以下简称NVIC),设置每个中断的优先级,并处理一个中断(高优先级)和另一个中断(低优先级),高优先级中断可以抓住低优先级中断,导致中断中断,抢占这种中断称为中断嵌套。例如,如果发生低优先级中断并正在实施,则会发生高优先级中断,ARM CPU 暂停低优先级中断,开始实施高优先级中断,先中断服务程序完成后继续实施低优先中断服务程序,如图所示:
▲图6 中断优先级抢占
以不同的优先级触发3个异常/中断。IRQ1 抢占了IRQ2,并强制IRQ3 暂停,直到 IRQ1 完成。在 IRQ1 ISR 完成之后,ISR2 会继续从 IRQ1 抓住它时中断的地方。最后,在 ISR2 完成后,ISR3 开始执行。ISR执行完成后,上下文将恢复到主程序。
NVIC支持的另一个概念是中断尾链。当触发中断(异常)时,主程序代码的上下文保存在堆栈中,处理器分支到相应的中断向量开始执行 ISR 处理程序。在 ISR 最后,将弹出保存在堆栈中的上下文中,以便处理器能够恢复主程序代码指令。但是,高优先级ISR抓住低优先级ISR当处理器跳过上下文保存和恢复时,直接处理第二个 ISR,没有额外费用。这被称为"尾链",如下图所示:
▲图7NVIC嵌套尾链中断示意图
NVIC中断处理嵌套处理嵌套的支持,使更高级别的中断信号能够直接响应更高级别的中断信号,而无需关闭中断,提高了重要中断的响应速度。
03.
随着SMP(Symmetric Multiprocessing)随着架构的发展,外部中断源的数量继续增加。软中断(Software Interrupt,SWI)和核间中断(Interprocessor Interrupt,IPI),基于信息传递的中断(Message Signaled Interrupts,MSI),对虚拟化的支持需要中断控制器的深度参与。传统的中断控制器已经不能满足需求,每个架构都开始使用更成熟的中断控制器。
Intel在2000年左右,率先引入了一个名字APIC新组件取代旧的 8259A 可编程中断控制器。APIC包括两部分:一是本地APIC(Local APIC),主要负责将中断信号传输到指定处理器。二是I/O APIC,主要来自收藏 I/O 设备的 Interrupt 中断时将信号发送到本地 APIC。
▲图8本地APICs和I/O APIC被用于Intel强系列多核芯片系统
ARM使用通用中断控制器(GenericInterruptController,以下简称GIC),从外设中断,优先排序并传输到相应的处理器内核。
▲图9GIC工作示意图
与 ARM架构一样,GIC 结构也随着时间的推移而发展。下表总结了 GIC 标准的主要版本和通常与它们一起使用的处理器:
▲表2 GIC版本之间的区别
- 共享外设中断(Shared Peripheral Interrupt,SPI),所有核心都可以接收中断;/li
- 私有的外设中断(Private Peripheral Interrupt,PPI),某一个核心独有的中断;
- 软中断(Software Generated Interrupt,SGI),通过写GIC中的SGI寄存器产生,常用与核间通信;
- 本地特定外设中断(Locality-specific Peripheral Interrupt,LPI),v3新增的中断类型,基于消息传递的中断。
- 以GICv3/v4为例,GIC有四种中断状态,分别是:
- 未激活(Inactive),中断源还未激活;
- 挂起(Pending),中断源已激活,但无中断信号;
- 激活(Active),CPU已经响应中断;
- 激活并等待(Active and Pending),CPU已响应中断,同时新的中断挂起。
▲图10 GIC中的中断的4种状态
AMD和Cyrix在1995年初提出了OpenPIC中断控制器规范,支持多达32个处理器。OpenPIC架构在1995年左右至少得到了IBM和康柏的声明性支持,但没有x86主板与OpenPIC一起发布。在 OpenPIC在x86市场失败后,AMD 为其 AMD 速龙和更高版本的处理器授权了英特尔 APIC 架构,而IBM基于OpenPIC寄存器规范开发了他们的多处理器中断控制器(Multiprocessor Interrupt Controller,MPIC)。NXP基于的PowerPC架构的多核处理器,如PowerQUICC 和QorIQ 系列的处理器,依然采用MPIC作为中断控制器。
MPIC 兼容 OpenPIC 并有所增强,主要包括增加了 #cint 和 #mcp 中断信号输出,更灵活的多处理器中断路由算法等,MPIC的基本功能如下图所示:
▲图11 MPIC流程框图
- Int Capture Register可以获取到Timer中断,外部中断,IPI中断三种类型的中断;
- EPIC从Int Capture Register中获取非屏蔽的中断信号;
- 基于优先级和分配算法分配中断到某一CPU上;
- CPU读MPIC IAR寄存器获取中断源;
- 每个CPU通过MPIC EOI寄存器表示结束各自的中断。
NXP基于PowerPC架构的单核处理器,如 MPC8240和MPC8245,通常采用基于openPIC的嵌入式中断控制器(Embedded Programmable Interrupt Controller,EPIC)。EPIC或者MPIC通常都被统称为PIC。MPC8245的PIC功能框图如下图所示:
▲图12 MPC8245的PIC功能框图
- 中断优先级的值由0-15,共16个优先级,以15为最高优先级;
- 接收5个外部中断和16个串行中断源;
- 接收4个可产生中断的定时器;
- 支持PIC Pass-Through模式;
- 支持PIC Direct Interrupt模式;
- 接收DUART, DMA, I2C, MU, WP接口连接的设备的中断;
- 支持嵌套中断。
04.
SkyEye,中文全称天目全数字实时仿真软件,是基于可视化建模的硬件行为级仿真平台,现在已支持x86/ARM/DSP/PowePC/Sparc/MPIS等多种主流芯片架构的仿真,同时支持数十款主流芯片及其中断控制器。
更多 SkyEye 相关内容,欢迎关注公众号迪捷软件或访问 www.digiproto.com 进行了解!
《8259A PROGRAMMABLE INTERRUPT CONTROLLER (8259A/8259A-2)》
《Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1》
《PrimeCell® Vectored Interrupt Controller (PL190) Technical Reference Manual Revision: r1p2》
《Arm Generic Interrupt Controller v3 and v4 Overview Version 3.2》
《Multiprocessor Interrupt Controller Data Book》
《MPC8245 Integrated Processor Reference Manual》