在阅读本章之前,可以参考笔者之前关于GIC的一些描述:

ARM通用中断控制器GIC(generic Interrupt Controller)简介

ARM架构Generic Interrupt Controller(GIC)之Distributor和CPU interface功能介绍

ARM架构Generic Interrupt Controller(GIC)详解之术语介绍

ARM通用中断控制器GIC之中断处理简介

文章目录

  • 一,GIC中断使能
  • 二,设置或清除一个中断的Pending状态
    • 2.1 Interrupt Set-Pending Registers, GICD_ISPENDRn
    • 2.2 Interrupt Clear-Pending Registers, GICD_ICPENDRn
  • 三,查找处于active或者pending状态的中断
  • 四,产生SGI中断
    • 4.1 Software Generated Interrupt Register, GICD_SGIR
    • 4.2 安全扩展下产生SGI中断
    • 五,GIC 1-N模型

一,GIC中断使能

对于外设中断,处理器可以通过:

  • 写入GICD_ISENABLERn 寄存器的对应bit来使能该中断。
  • 写入 GICD_ICENABLERn 寄存器的对应bit来禁止该中断。
    对于SGI中断是否能通过上述两个寄存器来enable和disable,这个由具体的实现( IMPLEMENTATION DEFINED)来定义。
    此外写入GICD_ISENABLERn 和GICD_ICENABLERn 寄存器只是控制Distributor是否能将该中断转发到CPU interface,并不会阻止该中断改变状态。比如写入GICD_ICENABLERn 寄存器来disable对应中断,并不能阻止他变成pending状态。

二,设置或清除一个中断的Pending状态

对于外设中断,处理器可以:

  • 写入GICD_ISPENDRn寄存器的对应bit来设置中断状态为pending。
  • 写入 GICD_ICPENDRn寄存器的对应bit来清除该中断的pending状态。
    对于电平敏感的中断:
  • 如果中断信号已经被assert,处理器再写入GICD_ICPENDRn寄存器的对应bit来清除中断将不产生作用。
  • 如果处理器通过写入GICD_ISPENDRn来使对应中断状态变为pending,将忽略该中断的硬件信号,并且保留pending状态,不管该中断是被asserted还是deasserted。
    包含pending的中断状态有两种:
  • pending
  • active and pending
    对于边沿触发的中断来讲,包含pending的中断状态可以通过写入GICD_ISPENDRn寄存器,或者GIC对该中断信号的assertion来进行锁定。
    但是对于电平敏感的中断来讲,它的包含pending的中断状态可以通过写入GICD_ISPENDRn寄存器来锁定,但是不能根据传递到GIC的中断信号来锁定。
    以下是电平敏感中断的电路逻辑示意图:

    此外,对于SGI中断,GIC将忽略对GICD_ISPENDRn和GICD_ICPENDRn寄存器的写入,处理器不能通过写入这些寄存器来改变SGI中断的中断状态。一般情况下,处理器可以通过写入 GICD_SGIR寄存器来使SGI中断变成pending,在GICv2中,SGI的pending状态可以通过直接写入GICD_SPENDSGIRn 和 GICD_CPENDSGIRn 寄存器的对应位来改变。

2.1 Interrupt Set-Pending Registers, GICD_ISPENDRn

GICD_ISPENDRn寄存器提供一个Set-pending bit,对该bit写入1能够将对应外设中断的状态设置为pending,读取对应bit则可以知道该中断是否处于pending状态。
在多处理器系统中,GICD_ISPENDR0(PPI和SGI)寄存器被每个与GIC相连的处理器banked(复用)。

从GICD_ISPENDR0开始,寄存器里每个bit代表一个不同中断ID的中断控制位,比如GICD_ISPENDR0[0]表示控制中断ID为0的中断。
对该寄存器进行读取:

  • 读到0:表明对应中断在任何处理器中都不处于pending状态。
  • 读到1:
    - 对于SGI和PPI中断,当前中断在当前处理器中是pending状态的。
    - 对于SPI中断,当前中断至少在一个处理器中处于pending状态。
    上文提到过,对于SGI中断,写入GICD_ISPENDRn寄存器的操作将会被忽略,因为SGI有自己的Set-pending寄存器 SGI
    Set-Pending Registers, GICD_SPENDSGIRn。对于SPI和PPI中断来讲:
  • 写入0:无影响
  • 写入1:其效果取决于是边缘触发还是电平敏感中断:
    - 边缘触发(Edge-triggered),如果当前中断已经是pending状态,则不受影响;如果之前是inactive状态,则会变成pending状态;如果之前是active状态,则会变成active and pending状态。
    - 电平敏感(Level sensitive),如果当前中断已经是pending状态,如果对应中断信号已经被asserted,写操作将不会改变中断的状态,但是该中断信号被deasserted后该中断将仍保持pending状态;如果对应中断未处于pending状态,如果之前是inactive状态,则会变成pending状态;如果之前是active状态,则会变成active and pending状态。

2.2 Interrupt Clear-Pending Registers, GICD_ICPENDRn

GICD_ICPENDRs为GIC支持的每个中断提供一个Clear-pending bit。写入对应中断的Clear-pending位将清除该中断的pending状态。读取该bit位是否为1可以确定中断是否处于pending状态。

对该寄存器进行读取:

  • 读到0:表明对应中断在任何处理器中都不处于pending状态。
  • 读到1:
    - 对于SGI和PPI中断,当前中断在当前处理器中是pending状态的。
    - 对于SPI中断,当前中断至少在一个处理器中处于pending状态。
    对于SPI和PPI中断来讲:
  • 写入0:无影响
  • 写入1:其效果取决于是边缘触发还是电平敏感中断:
    - 边缘触发(Edge-triggered),如果中断不处于pending状态,则不受影响。如果之前是pending状态,则会变成inactive状态;如果之前是active and pending状态,则会变成active状态。
    - 电平敏感(Level sensitive),如果当前中断的pending状态是由于写入GICD_ISPENDRn寄存器导致的:如果之前是pending状态,则会变成inactive状态;如果之前是active and pending状态,则会变成active状态。否则,如果中断信号仍被asseted,中断将保持pending状态。

三,查找处于active或者pending状态的中断

若想知道一个中断是否处于pending状态,可以读取 GICD_ISPENDRn 或者GICD_ICPENDRn寄存器。若想知道中断是否处于active状态,可以读取 GICD_ISACTIVERn 或者GICD_ICACTIVERn,这两个寄存器有Set-active和clear-active 位用来控制中断的active状态。

四,产生SGI中断

处理器可以通过写入GICD_SGIR寄存器来产生一个SGI中断,一个SGI中断可以设置多个目标处理器,并且SGIR寄存器里有目标寄存器列表。GICD_SGIR包括如下优化:

  • 只中断写入GICD_SGIR的处理器
  • 中断除写入GICD_SGIR的处理器以外的所有处理器
    来自不同处理器的SGI中断使用同一个中断ID,所以任何目标处理器可以收到来自不同处理器产生的相同中断ID的SGI。但是如果以下条件不同,则任意两个SGI中断的pending状态是独立的:
  • 中断ID
  • 源处理器
  • 目标处理器
    在CPU interface中,在任何时候,一次只能有一个特定中断ID的中断处于active状态,这意味着CPU interface不能同时有两个SGI处于active状态,甚至是不同处理器使用相同中断ID的SGI中断发送中断信号到该处理器。
    在目标处理器的CPU interface中,通过读取 GICC_IAR寄存器,可以获得中断ID,以及产生该中断的CPU ID,即源处理器ID。中断ID加上源处理器ID,可以让目标处理器获知该中断独一无二的来源。
    此外,在多处理器系统中,每个SGI中断的优先级可以为每个目标处理器单独设置,详情可查看 Interrupt Priority Registers, GICD_IPRIORITYRn,中断优先级寄存器。对于每个CPU interface来讲,对于所有优先级相同的,特定中断ID的,处于pending状态的SGI中断,CPU interface序列化地处理它们,具体的系列化处理顺序取决于系统的实现定义(IMPLEMENTATION SPECIFIC.)。

4.1 Software Generated Interrupt Register, GICD_SGIR

处理器写入GICD_SGIR可以产生SGI中断。使用限制:通过写入 GICD_CTLR寄存器来将Distributor的转发功能禁止,是否会影响GICD_SGIR,这个由具体的实现定义( IMPLEMENTATION DEFINED)。以下是GICD_SGIR寄存器的字段分配图:

  • [25:24] TargetListFilter:这将决定Distributor如何处理被请求的SGI中断,即要转发到何处:
    - 0b00:将中断转发到在CPUTargetList定义的CPU interface中
    - 0b01:将中断转发到所有CPU interface中,除了当前请求中断的处理器。
    - 0b10:将中断转发到当前请求SGI中断的处理器相连的CPU interface中。
    - 0b11:保留
  • [23:16] CPUTargetList:如果TargetListFilter的值为0b00,CPUTargetList中将定义Distributor必须被转发到的CPU interface。CPUTargetList中共八个bit,每个bit代表一个处理器。比如CPUTargetList[0]对应CPU interface 0,如果CPUTargetList[0]=1,表明该SGI中断必须转发到CPU interface 0。如果TargetListFilter的值为0b00,并且CPUTargetList也为0,说明Distributor不需要将中断转发到任何CPU interface。
  • [15] NSATT:仅在系统包含安全扩展中实现,如果没有实现安全扩展,这个字段将保留。NSATT指定SGI需要的security value:
    - 只有当SGI在该CPU interface上被配置为Group 0时,才将SGIINTID字段中指定的SGI转发到指定的CPU interface。
    - 只有当SGI在该CPU interface上被配置为Group 1时,才将SGIINTID字段中指定的SGI转发到指定的CPU interface。
    - 该字段只可以在安全状态下被写入,只有当指定的SGI中断被配置成group 1时,任何对GICD_SGIR的非安全写入才会生成SGI,并且忽略NSATT的值。
  • [3:0] SGIINTID : 需要被转发到指定的CPU interface中的SGI中断的中断ID,范围是0到15。

4.2 安全扩展下产生SGI中断

如果GIC实现了安全扩展,通过写入GICD_SGIR寄存器,使得SGI中断转发到指定的处理器,这取决于:

  • 写入GICD_SGIR的是Group 0(secure)还是Group 1(non-secure)
  • 对于secure写入SGIR,写入 GICD_SGIR的NSATT字段的值。
  • 在目标处理器中,特定的中断是否被配置成Group 0(secure)还是Group 1(non-secure)。

GICD_IGROUPR0寄存器中保存了SGI中断的安全状态。在多处理器系统中, GICD_IGROUPR0被每个与之相联的处理器banked(复用),所以系统可以为每个处理器独立设置SGI中断的安全状态。对GICD_SGIR寄存器写一次,可以配置多个目标处理器,对于每个目标处理器,Distributor将决定是否将SGI中断转发到该处理器。
下表展示了Distributor是否可以将SGI转发到指定的CPU interface的真值表:

五,GIC 1-N模型

GIC在多处理器实现中,会使用1-N模型,处理有多个目标处理器的外设中断,比如SPI。这意味着,这意味着,当GIC从其中一个目标处理器识别出一个中断确认时,它将清除所有其他目标处理器上的中断的pending状态。GIC必须确保使用1-N模型处理的任何中断时,只能被一个CPU interface确认,并且所有其他CPU interface都返回一个虚假中断ID。
当目标处理器试图确认中断时,有两种情况会发生:

  • 处理器读取 GICC_IAR寄存器,并获得需要被服务的中断的ID。在GICv1中,如果多个处理器读取GICC_IAR寄存器的时间非常接近,可以会有多个处理器会获取到该中断ID。系统必修要求在目标处理器上运行的软件来确保只有一个处理器能进行中断服务程序。一种典型的实现方案是使用共享内存,并且在中断服务程序(interrupt service routine,ISR)中加锁。
  • 处理器读取 GICC_IAR寄存器,获取到虚假中断ID:1023。该处理器会从中断服务程序中返回,并且不用写入GICC_EOIR寄存器。读到虚假中断ID,是因为原始的中断不再 处于pending状态,一般是因为有其他目标处理器在处理该中断。

ARM通用中断控制器GIC之中断控制相关推荐

  1. Linux中断子系统(一)中断控制器GIC架构

    Linux中断子系统(一)中断控制器GIC架构 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: Linux中断子系统(一)中 ...

  2. ARM通用中断控制器GIC之中断处理简介

    在阅读本章之前,可以参考笔者之前关于GIC的一些描述: ARM通用中断控制器GIC(generic Interrupt Controller)简介 ARM架构Generic Interrupt Con ...

  3. ARM通用中断控制器GIC(generic Interrupt Controller)简介

    参考文档: Documentation – Arm Developer  ARM Generic Interrupt Controller Architecture Specification 目录 ...

  4. Linux中断子系统(二)中断控制器GIC驱动分析

    Linux中断子系统(二)中断控制器GIC驱动分析 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客: Linux中断子系统(一 ...

  5. ARM通用中断控制器GIC之中断处理状态机 Interrupt handling state machine

    中断有四种状态:inactive,pending,active 和active and pending.而产生中断的方式有两种,一种是通过写pending寄存器,让中断进入pending状态,可以忽略 ...

  6. GD32F303课程【3】中断控制器和外部中断

    目录如下,持续更新~~ [1]星空派GD32F303开发板介绍 与 文章目录 1. 中断源 GD32F303有16个内核中断和68个可屏蔽中断中断源,具体见文件"gd32f30x.h&quo ...

  7. Linux 中断控制器(五):中断号映射

    中断号分为硬件中断号(HW ID)和软件中断号(IRQ number). 这里有两个中断控制器,处理完毕进入 CPU.外设和中断控制器连接在一起,外设给中断控制器的是硬件中断号,如果中断控制器有级联, ...

  8. 8259A中断控制器详细介绍

    中断的来源除了来自于硬件自身的NMI中断和来自于软件的INT n指令造成的软件中断之外,还有来自于外部硬件设备的中断,这些中断是可屏蔽的.这些中断也都通过PIC(Programmable Interr ...

  9. GIC通用中断控制器

    1. GIC简介 操作系统中,中断是很重要的组成部分.有了中断系统才可以不用一直轮询(polling)是否有事件发生,系统效率才得以提高.一般在系统中,中断控制分为三个部分:模块.中断控制器和处理器. ...

最新文章

  1. a:hover代表什么含义_板式热交换器型号该如何看?代表什么含义?
  2. python求13号是星期几的次数_Python简单计算给定某一年的某一天是星期几示例
  3. Python中单下划线开头的特性
  4. 数据库原理与应用(SQL Server)笔记 第九章 存储过程和触发器
  5. Apple Swift 编程语言入门教程
  6. 心学 禅宗_禅宗宣言,用于有效的代码审查
  7. HTML页面禁止选择、页面禁止复制、页面禁止右键
  8. Hibenate映射属性
  9. 顶级论文创新点怎么找?中国高校首次获CVPR最佳学生论文奖有感
  10. matlab cftool 最小二乘,最小二乘法与matlab拟合工具箱cftool
  11. 基于Vue+AntDesign实现的JAVA前后端分离后台管理系统
  12. 下载 .m3u8视频文件
  13. 51单片机带闹钟c语言程序,51单片机带闹钟可调时间的电子时钟程序设计
  14. @keyframes详解
  15. scratch节假日课程:元旦贺卡的制作
  16. ICM-42605 6轴MEMS加速度计陀螺仪运动传感器数据的读取
  17. 设置淘宝sku方法技巧 淘宝SKU如何设置
  18. 零和博弈中范式概率的计算
  19. 天九共享携手猫屎咖啡打造商业高速服务区
  20. 最优控制学习笔记——最优控制问题基本组成

热门文章

  1. 360加固保mac不能打开以及不能输入密码的解决方法
  2. Lazysnapping Grabcut 算法实现的结果
  3. 生成扫频音频(也可以生成单频点音频)
  4. 几何光学(一):对于费马原理的一些简单理解
  5. 攀钢集团整体上市推出三合一方案
  6. “ABAQUS复合材料建模技术与应用”专题
  7. kmeans算法中的sse_kmeans聚类理论篇
  8. uni-app 声音/震动提示,播放系统默认消息声音 安卓(Android)测试通过
  9. 测试开发工程师到底是做什么的?
  10. 跟客户谈判的时候尽力而为如果最后亏本还谈不下那就放弃