由于引入了GIC,在设置中断控制器的时候不免产生各种计算,各种寄存器编号换算比较繁琐,在此提供一种计算方式。
GIC处理中断的流程
GIC中由成百上千的寄存器,要理清寄存器的设置思路,必须要理解GIC是如何处理中断源发来的中断信号的。
首先,GIC有一个全局开关——ICDDCR。这个寄存器决定了GIC是否会处理外围的中断信号,因此必须先将它打开。
中断信号到来后,第一个要面对的是GIC的中断源屏蔽,这里GIC提供了两种策略:白名单——ICDISER_CPU,以及黑名单—— ICDICER_CPU。
在白名单中,相应的中断源位置1表示允许这个中断;在黑名单中,相应的中断源位置1表示禁止这个中断。一般情况下,我们都是使用白名单。
OK,现在许多的中断信号都被允许进入GIC了,接下来中断信号们面对的是GIC的优先级处理系统。这个优先级的处理简单的说就是:谁的优先级高,就先响应谁;低于最低优先级的中断信号将被阻止。
经过了两轮过滤,剩下的中断信号都将交给CPU处理。那么又出现了一个先后顺序的问题。FIQ优先级高于IRQ这是一定的,另外,在GIC中可以设置每一个中断源的优先级,GIC将根据优先级高低,依次将信号传送给CPU。
对于一个将要传送给CPU的中断信号,我们是要将它给哪个CPU呢?因为多核处理器有很多的CPU。仍然是通过寄存器来设置。
到了最后一关,前面只是中断信号自己“一厢情愿”的想要交给CPUn处理