• 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

  • 相关阅读:
    C# 桌面软件开发之超精简WinForm无边框方案(可靠边自动分屏)
    C++ Primer Plus学习笔记之开始学习C++
    C++ Primer Plus学习笔记之复合类型(上)
    C# 创建系统右键菜单按钮关联指定程序(无需管理员权限)
    C# 小工具开源分享之本机IP修改器
    JavaScript库hxsfx.ajax之解决动态加载HTML
    解决npm无法装包的问题
    1.node搭配对应版本的npm
    Node npm升级
    vue3(模版语法&指令)
  • 原文地址:https://www.cnblogs.com/lztutumo/p/16411918.html
Copyright © 2020-2023  润新知