当前位置: 首页 > news >正文

【ARMv8/v9 GIC 系列 2.1 -- GIC SPI 中断的 pending 和 clear pending 配置】

文章目录

    • GIC Pending 和 Clear Pending
      • GICD_ISPENDR<n>
      • GICD_ICPENDR<n>
      • 参数<n>编号解释
      • 使用举例
        • 设置中断ID 100为挂起状态
        • 清除中断ID 100的挂起状态
      • 代码实现
      • 小结

GIC Pending 和 Clear Pending

在ARMv8体系结构中,GICD_ISPENDR<n>GICD_ICPENDR<n> 是GIC(通用中断控制器)中的两组重要寄存器,它们分别用于设置和清除中断的挂起状态。这些寄存器允许软件控制中断的挂起状态,从而在高级中断管理中起到关键作用。

GICD_ISPENDR

在这里插入图片描述

  • 寄存器名称:Interrupt Set-Pending Registers
  • 目的:用于将特定的中断标记为挂起状态。
  • 描述GICD_ISPENDR<n> 寄存器允许软件将中断标记为挂起。当向这些寄存器的特定位写入 1 时,相应的中断会被设置为挂起状态,这意味着中断已经准备好被GIC处理。写入 0 对该位没有影响。

GICD_ICPENDR

在这里插入图片描述

  • 寄存器名称:Interrupt Clear-Pending Registers
  • 目的:用于清除特定中断的挂起状态。
  • 描述GICD_ICPENDR<n> 寄存器允许软件清除中断的挂起状态。当向这些寄存器的特定位写入 1 时,相应的中断挂起状态会被清除,这意味着中断不再准备好被处理。写入 0 对该位没有影响。

参数编号解释

参数 <n> 表示寄存器的索引,根据系统支持的中断数量而变化。例如,如果 GIC 支持最多 1020 个中断,则 GICD_ISPENDRGICD_ICPENDR 寄存器会有多个(例如从 GICD_ISPENDR0GICD_ISPENDR31),因为每个寄存器可以控制 32 个中断的挂起状态。

使用举例

假设我们要将中断ID 100标记为挂起,并随后清除其挂起状态:

设置中断ID 100为挂起状态
  1. 确定正确的寄存器和位位置:
    • 中断ID 100 位于 GICD_ISPENDR3 (因为 100 / 32 = 3),位于该寄存器的第 100 % 32 = 4 位。
  2. 设置挂起:
    GICD_ISPENDR3 |= (1 << 4);
    
清除中断ID 100的挂起状态
  1. 同样,位于 GICD_ICPENDR3 寄存器,位位置为第 4 位。
  2. 清除挂起:
    GICD_ICPENDR3 |= (1 << 4);
    

代码实现

void gic_irq_set_pending(int irq)
{uint32_t addr;if (!is_spi_irq(irq)) {log_err("irq%d is not a spi irq\n", irq);return;}/* Calculate enable register offset and bit position */uint32_t reg_offset = irq / 32;uint32_t reg_shift  = irq % 32;addr = ISPENDR_ADDRESS(GIC_DISTRIBUTOR_BASE, reg_offset);write32(addr, (1 << reg_shift));
}void gic_irq_clear_pending(int irq)
{uint32_t addr;if (!is_spi_irq(irq)) {log_err("irq%d is not a spi irq\n", irq);return;}uint32_t reg_offset = irq / 32;uint32_t reg_shift  = irq % 32;addr = ICPENDR_ADDRESS(GIC_DISTRIBUTOR_BASE, reg_offset);write32(addr, (1 << reg_shift));
}

小结

  • 操作这些寄存器通常需要有特权级别的代码执行,因此通常在操作系统的内核或中断管理器中进行。
  • 写入这些寄存器时要特别注意,错误的操作可能导致中断错误挂起或无法正确处理。
  • 如需为特定应用编程,确保理解你的系统的具体GIC版本和实现细节。
http://www.lryc.cn/news/377664.html

相关文章:

  • SpringBoot集成logback初始化源码解析(部分)
  • 【Linux工具】yum软件包管理器与Vim编辑器的高效运用
  • Matlab数学建模实战应用:案例4 - 图像处理
  • Studying-代码随想录训练营day15| 222.完全二叉树的节点个数、110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和
  • Python 基础:异常
  • XML 应用程序
  • SprringCloud Gateway动态添加路由不重启
  • Windows安装mysql
  • chatgpt: linux 下用纯c 编写ui
  • Java十六进制Dump打印数据
  • 某棋牌渗透测试
  • JAVA面试(六)
  • 【C语言】手写学生管理系统丨附源码+教程
  • 流媒体传输协议HTTP-FLV、WebSocket-FLV、HTTP-TS 和 WebSocket-TS的详细介绍、应用场景及对比
  • 【机器学习】线性回归:从基础到实践的深度解析
  • 短视频开源项目MoneyPrinterTurbo:AI副业搞起来,视频制作更轻松!
  • 【JAVA】SpringBoot + skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上
  • [xmake]构建静态库和动态库
  • 功能测试 之 单模块测试----轮播图、登录、注册
  • MyBatis-PageHelper 源码解说
  • 基于uni-app和图鸟UI的智慧校园圈子小程序开发实践
  • STM32 keil工程移植到Visual Studio Code环境中编译
  • 细说CountDownLatch
  • java-克隆应用
  • RPC协议
  • 医疗器械3D全景展会在线漫游创造数字化时代的展览新篇章
  • IP_Endpoint类型在CAPL中的使用
  • 数据资产与用户体验优化:深入挖掘用户数据,精准分析用户需求与行为,优化产品与服务,提升用户体验与满意度,打造卓越的用户体验,赢得市场认可
  • 基于TCAD与紧凑模型结合方法探究陷阱对AlGaN/GaN HEMTs功率附加效率及线性度的影响
  • 具身智能概念