二、arm32中断子系统的硬件原理
如上图所示,arm32中断子系统的硬件主要由3个部分构成:外设、中断控制器GIC以及cpu;外设产生中断后,通过中断线汇聚到GIC,GIC处理后,统一分发给各个cpu。除了外设能产生中断,cpu产生的核间中断,以及cpu自己的私有中断都是先汇聚到GIC,由GIC统一处理。
2.1 中断控制器
从总体功能上看,中断控制器可以实现中断的使能和关闭、中断的优先级设置、指定中断分发到哪个cpu以及指定各cpu可以处理的中断优先级等功能。
按照功能,可以将GIC分成2个模块:Distributor和CPU Interface;其中,Distributor的主要功能有:
1、Distributor使能,也就是使能Distributor的功能;
2、使能各个中断到分配器,也就是打开或关闭每个中断;
3、选择cpu接口,设置中断由哪个cpu处理;
4、每个中断的状态可见,提供寄存器来设置和清除中断的pending状态;
5、设置每个中断的Group:Group0或Group1,其中Group0用于安全中断,支持FIQ和IRQ,Group1用于非安全中断,只支持IRQ;
CPU Interface的主要功能有:
1、每个cpu对应一个cpu interface;
2、使能到该cpu的中断;
3、中断优先级阈值,设置cpu能处理哪些优先级的中断,中断的优先级只有高于该阈值才能被分发到该cpu;
4、中断确认,也就是清除cpu中断标志位;
5、(待确认)标识中断处理的完成、设置处理器的中断抢占策略;
2.2 itop4412处理按键中断的例子
如上图所示,是itop4412中断控制器处理按键中断的硬件原理简图。按键接在GPIO控制器的GPX1_1引脚上,GPIO上与GPX1_1对应的中断线接到中断控制器的INT[9]引脚上(通过数据手册可以查到INT[9]对应的硬件中断号)。需要做的配置如下:
GPIO控制器部分需要对GPX1_1配置为中断模式,具体配置如下:
配置引脚功能为外部中断
GPX1CON = GPX1CON & (~(0xf << 4)) |(0xf << 4);
关闭上下拉电阻
GPX1PUD = GPX1PUD & (~(0x3 << 2));
配置GPIO中断的触发方式
EXT_INT41CON = (EXT_INT41CON & (~(0xf << 4))) | (0x2 << 4);
使能GPIO控制器对应GPIO的中断
EXT_INT41_MASK = EXT_INT41_MASK & (~(0x1 << 1));
GIC的初始化可以分为Distributor和Cpu Interface两个部分,具体配置如下:
Distributor初始化:
使能分配器
ICDDCR = 1;
使能相应中断到分配器(ID[57])
ICDISER1_CPU0 = ICDISER1_CPU0 | (0x1 << 25);
选择CPU接口,设置SPI[25]/ID[57]由哪个cpu处理,当前设置为cpu0的irq中断
ICDIPTR14_CPU0 = ICDIPTR14_CPU0 & (~(0xff << 8))|(0x1 << 8);
Cpu Interface初始化:
使能到CPU0的中断
ICCICR_CPU0 = 1;
设置CPU0的中断优先级屏蔽寄存器,设置CPU0能处理所有优先级的中断
ICCPMR_CPU0 = 255;
按照上述配置完后,当按键中断产生后,中断控制器就会将中断传递到cpu0,cpu0执行完当前指令,检测到IRQ中断产生,于是自动将运行模式切换到IRQ中断模式(将CPSR拷贝到SPSR_IRQ,再修改CPSR进入IRQ中断模式),然后,将PC指针指向IRQ中断向量表,开始由软件对中断进行处理;软件通过读中断控制器的寄存器,就可以知道该中断的硬件中断号,从而知道是按键中断产生。
本文大部分内容是对如下两个博客的分析总结,以便自己更好地理解,如有侵权,请联系删除
参考博客:
https://blog.csdn.net/zqixiao_09/article/details/50739121
https://www.cnblogs.com/LoyenWang/p/12996812.html