原文见正点原子Linux开发
1
、
GIC
控制器总览
STM32(Cortex-M)
的中断控制器叫做
NVIC
,
I.MX6U(Cortex-A)
的中断控制器叫做
GIC
,
关于
GIC
的详细内容请参考开发板光盘中的文档
《
ARM Generic Interrupt Controller(ARM GIC
控制器
)V2.0.pdf
》
。
GIC
是
ARM
公司给
Cortex-A/R
内核提供的一个中断控制器,类似
Cortex-M
内核中的
NVIC
。目前
GIC
有
4
个版本
:V1~V4
,
V1
是最老的版本,已经被废弃了。
V2~V4
目前正在大
量的使用。
GIC V2
是给
ARMv7-A
架构使用的,比如
Cortex-A7
、
Cortex-A9
、
Cortex-A15
等,
V3
和
V4
是给
ARMv8-A/R
架构使用的,也就是
64
位芯片使用的。
I.MX6U
是
Cortex-A
内核
的,因此我们主要讲解
GIC V2
。
GIC V2
最多支持
8
个核。
ARM
会根据
GIC
版本的不同研发
出不同的
IP
核,那些半导体厂商直接购买对应的
IP
核即可,比如
ARM
针对
GIC V2
就开发出
了
GIC400
这个中断控制器
IP
核。当
GIC
接收到外部中断信号以后就会报给
ARM
内核,但是
ARM
内核只提供了四个信号给
GIC
来汇报中断情况:
VFIQ
、
VIRQ
、
FIQ
和
IRQ
,他们之间的
关系如图
17.1.3.1
所示:
GIC控制器
ARM内核
![](https://i-blog.csdnimg.cn/direct/545d2d19d5664702915929006af7cc62.png)
图
17.1.3.1
中断示意图
在图
17.1.3.1
中,
GIC
接收众多的外部中断,然后对其进行处理,最终就只通过四个信号
报给
ARM
内核,这四个信号的含义如下:
VFIQ
:
虚拟快速
FIQ
。
VIRQ
:
虚拟外部
IRQ
。
FIQ
:
快速中断
IRQ
。
IRQ
:
外部中断
IRQ
。
VFIQ
和
VIRQ
是针对虚拟化的,我们不讨论虚拟化,剩下的就是
FIQ
和
IRQ
了,我们前
面都讲了很多次了。本教程我们只使用
IRQ
,所以相当于
GIC
最终向
ARM
内核就上报一个
IRQ
信号。那么
GIC
是如何完成这个工作的呢?
GICV2
的逻辑图如图
17.1.3.2
所示:
![](https://i-blog.csdnimg.cn/direct/dde7ccf08e6b4dc4922101683ea2789c.png)
图
17.1.3.2
中左侧部分就是中断源,中间部分就是
GIC
控制器,最右侧就是中断控制器向
处理器内核发送中断信息。我们重点要看的肯定是中间的
GIC
部分,
GIC
将众多的中断源分为
分为三类:
①、
SPI(Shared Peripheral Interrupt),
共享中断,顾名思义,所有
Core
共享的中断,这个是最
常见的,那些外部中断都属于
SPI
中断
(
注意!不是
SPI
总线那个中断
)
。比如按键中断、串口
中断等等,这些中断所有的
Core
都可以处理,不限定特定
Core
。
②、
PPI(Private Peripheral Interrupt)
,私有中断,我们说了
GIC
是支持多核的,每个核肯定
有自己独有的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断。
③、
SGI(Software-generated Interrupt)
,软件中断,由软件触发引起的中断,通过向寄存器
GICD_SGIR
写入数据来触发,系统会使用
SGI
中断来完成多核之间的通信。