linux arm32中断子系统学习总结(二)--- 硬件原理

2022/6/26 5:20:28

本文主要是介绍linux arm32中断子系统学习总结(二)--- 硬件原理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

二、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

 



这篇关于linux arm32中断子系统学习总结(二)--- 硬件原理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程