ARM中断学习笔记(一)

从周三开始到今天学了三天以后。记录一下学到的东西,顺便巩固和整理。

一。首先:学习了什么是中断

在中断出现之前,CPU和外设的通信中,CPU占主动地位,需要不断的去查询外设是否准备好,只有外设准备好了才能够进行操作,这段时间内CPU就被空置了,非常浪费资源。中断的原理是让外设在通信中占主导地位,CPU 通知IO设备即将开始传输之后,不等待IO设备,而是做其他工作,外设准备好了之后主动通知CPU 然后进行数据的传输。

二。通过芯片手册,ARM的手册gic_architecture_specification_v2.pdf,以及相关博客学习了ARM的中断系统。

ARM通用的中断系统控制器叫做GIC(general interrupt controller),是外设中断和CPU之间的桥梁,并且也是CPU之间互相通讯的桥梁。目前有四个版本,V1~V4(V2最多支持8个ARM core,V3/V4支持更多的ARM core,主要用于ARM64系统结构)。我们使用的是V2标准,使用的是GIC-400,它更适合嵌入式系统,符合version 2的GIC architecture specification。GIC-400通过AMBA(Advanced Microcontroller Bus Architecture)这样的片上总线连接到一个或者多个ARM processor上。另外由于我们用不到虚拟CPU,所以我没有去了解关于虚拟CPU的东西,本文中也就不提关于虚拟CPU的东西。

GIC中的中断有三种:

SPI(shared peripheral interrupu):外围共享中断,普通外设的中断,共享指不限定特定的CPU或者CORE,不针对特定的CPU。

PPI(private pheriperal interrupt):外围私有中断,这种中断一般发送给特定的CPU。

SGI(software generated interrupt):软件触发中断,主要用于CPU之间的通信。

中断ID:

每个中断都有唯一ID号,ID号0-15分配给SGI中断,ID号16-31分配给PPI中断,ID号32-1019分配给SPI中断。

但是,由于ARM CPU 对外的连接只有 个中断,一个是 IRQ(interupt request,中断请求) ,一个是 FIQ(fast interrupt request,快速中断请求) ,相对应的处理模式分别是一般中断( IRQ )处理模式和快速中断( FIQ )处理模式。所以 GIC 最后要把中断汇集成 条线,与 CPU 对接。在 IC 的后端设计中, layout 会把各个模块引过来的中断线(就是上面说的三种中断)混接到 GIC 上,然后把混聚合的中断接到 CPU 的 IRQ 和 FIQ 线上,这样 CPU 就有触觉了。

ARM中断学习笔记(一)

GIC由两部分组成,distributor 和 cpu interface:

其中,distributer 可以叫做聚集器或者分发器,是用来将中断集中起来然后分发给不同的cpu interface的装置。

distributor的主要功能包括:

全局使能或者关闭中断;

对单个的中断线使能或者关闭;

对每个中断设置优先级;

为每个中断设置目标处理器名单;

为每个外围中断设置是边沿触发还是电平触发;

为每个中断分类是属于Group0还是Group1(只在有具有GIC SECURITY EXTENSIONS的体系中);

将SGI中断传送给一个或者多个CPU;

cpu interface 是cpu的中断接口,主要功能包括:

使能被提交的中断;

确认收到了中断;

中断处理完成后进行反馈;

屏蔽优先级不够高的中断;

为处理器设置先占策略;

对处在pending状态的中断的优先级进行设置;

V2标准的GIC最多可以有8个CPU Interface,编号从0~7。

在具有GIC SECURITY EXTENSIONS的体系中,CPU Interface可以被设置从而可以接收以下几种中断模式:

1.Secure和non-secure 的通道来的中断

2.只secure的通道来的中断

3.只non-secure的通道来的中断

secure access的中断被划分到Group0, non-secure access的中断被划分到Group1.FIQ属于Group0。

图片中FIQ不经过GIC,直接到多选器的,这涉及到BYPASS的问题。

FIQFastinterrupt request,这是ARM上定义的一种中断处理方式,某些终端需要快速处理完成,在这种情况下,CPU会简化操作,然后退出中断。

那么从留向来说,途中是直接到CPU侧的,没有经过Distributor?

是的,我们说过,Distributor可以被使能,等各种操作,那么当其主功能暂时关闭了怎么办呢,这就又了BYPASS功能,一个已将IRQ直接绕过它,

送到CPU侧,在某些情况下这可以作为一个唤醒的信号源去WAKE UP 对应的CPU,或者可以设置成为X86上的NMI,也就是不可屏蔽中断来处理。