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 对外的连接只有 2 个中断,一个是 IRQ(interupt request,中断请求) ,一个是 FIQ(fast interrupt request,快速中断请求) ,相对应的处理模式分别是一般中断( IRQ )处理模式和快速中断( FIQ )处理模式。所以 GIC 最后要把中断汇集成 2 条线,与 CPU 对接。在 IC 的后端设计中, layout 会把各个模块引过来的中断线(就是上面说的三种中断)混接到 GIC 上,然后把混聚合的中断接到 CPU 的 IRQ 和 FIQ 线上,这样 CPU 就有触觉了。
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的问题。
FIQ是Fastinterrupt request,这是ARM上定义的一种中断处理方式,某些终端需要快速处理完成,在这种情况下,CPU会简化操作,然后退出中断。
那么从留向来说,途中是直接到CPU侧的,没有经过Distributor?
是的,我们说过,Distributor可以被使能,等各种操作,那么当其主功能暂时关闭了怎么办呢,这就又了BYPASS功能,一个已将IRQ直接绕过它,
送到CPU侧,在某些情况下这可以作为一个唤醒的信号源去WAKE UP 对应的CPU,或者可以设置成为X86上的NMI,也就是不可屏蔽中断来处理。