【ARMv8/v9 GIC 系列 2 -- GIC SPI 中断的 enable和 disable 配置】

news2024/12/23 9:17:00

文章目录

    • GIC 中断 Enable 和 Disable
      • GICD_ISENABLER<n>
      • GICD_ICENABLER<n>
      • 参数 n
      • 使用举例
      • 代码实现
      • 注意事项

GIC 中断 Enable 和 Disable

在ARMv8架构中,通用中断控制器(GIC)负责管理处理器的中断。为了控制和管理这些中断,GIC提供了一系列寄存器。其中,GICD_ISENABLER<n>GICD_ICENABLER<n> 是两组关键的寄存器,用于启用和禁用中断。

OffsetNameDescription
0x0100-0x017CGICD_ISENABLER<n>Interrupt Set-Enable Registers
0x0180-0x01FCGICD_ICENABLER<n>Interrupt Clear-Enable Registers

GICD_ISENABLER

在这里插入图片描述

  • 寄存器名称:Interrupt Set-Enable Registers
  • 目的:用于启用中断。
  • 描述:这些寄存器允许软件启用特定的中断。每个寄存器对应32个中断,每个位代表一个中断。写入1到某位会启用对应的中断,写入0对该位没有影响(即,不能通过写入0来禁用中断)。

GICD_ICENABLER

在这里插入图片描述

  • 寄存器名称:Interrupt Clear-Enable Registers
  • 目的:用于禁用中断。
  • 描述:这些寄存器允许软件禁用特定的中断。与GICD_ISENABLER<n>类似,每个寄存器对应32个中断,但写入1到某位会禁用对应的中断,写入0对该位没有影响。

参数 n

参数<n>代表寄存器的索引,根据系统支持的中断数量而变化。例如,如果GIC支持最多1020个中断,那么GICD_ISENABLERGICD_ICENABLER寄存器会有32个(从GICD_ISENABLER0GICD_ISENABLER31和从GICD_ICENABLER0GICD_ICENABLER31),因为每个寄存器可以控制32个中断。

可以通过下面函数判断一个中断是否为SPI中断:

static uint32_t is_spi_irq(int irq)
{
        return irq >= 32 && irq < 1020;
}

使用举例

假设我们要启用中断ID 68和禁用中断ID 95。

  • 启用中断ID 68
    • 中断ID 68在GICD_ISENABLER2寄存器中,因为68/32 = 2(整除)。
    • GICD_ISENABLER2中,68对应的位是68 % 32 = 4
    • 因此,通过向GICD_ISENABLER2写入1 << 4(即,0x10),可以启用中断ID 68。
GICD_ISENABLER2 |= (1 << 4);
  • 禁用中断ID 95
    • 中断ID 95在GICD_ICENABLER2寄存器中,因为95/32 = 2(整除)。
    • GICD_ICENABLER2中,95对应的位是95 % 32 = 31
    • 因此,通过向GICD_ICENABLER2写入1 << 31(即,0x80000000),可以禁用中断ID 95。
GICD_ICENABLER2 |= (1 << 31);

代码实现

下面代码展示了如何使用C代码实现 irq_enableirq_disable

void irq_enable(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 = GIC_ISENABLER_ADDRESS(GIC_DISTRIBUTOR_BASE, reg_offset);
        write32(addr, (1 << reg_shift));
}

void irq_disable(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 = GIC_ICENABLER_ADDRESS(GIC_DISTRIBUTOR_BASE, reg_offset);
        write32(addr, (1 << reg_shift));
}

注意事项

  • 在实际编程中,对GIC寄存器的访问需要按照你的处理器和系统的特定要求来进行,这可能包拍使用特权指令或通过特定的内存映射地址访问这些寄存器。
  • 操作这些寄存器时,需要确保不会意外地更改或启用/禁用其他中断,尤其是在对寄存器进行位操作时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SPI协议——对外部SPI Flash操作

目录 1. W25Q32JVSSIQ背景知识 1.1 64个可擦除块 1.2 1024个扇区&#xff08;每个块有16个扇区&#xff09; 1.3 页 1. W25Q32JVSSIQ背景知识 W25Q32JV阵列被组织成16,384个可编程页&#xff0c;每页有256字节。一次最多可以编程256个字节。页面可分为16组(4KB扇区清除&…

排序方法——《归并排序》

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …

chatgpt: linux 下用纯c 编写ui

在Linux下用纯C语言编写用户界面&#xff08;UI&#xff09;&#xff0c;通常会使用GTK或Xlib。GTK是一个更高级的库&#xff0c;提供了丰富的控件和功能&#xff0c;而Xlib则是一个更底层的库&#xff0c;提供了直接操作X Window系统的功能。 下面是一个使用GTK在Linux上创建…

第二十四节:带你梳理Vue2 : Vue具名插槽/作用域插槽/v-slot指令

1. 具名插槽 1.1 没有使用具名插槽的问题 有的时候我们在使用子组件时,在子组件模板上不同的位置插入不同的内容, 只有一个插槽显然没法满足我们的需求,看示例: 需求如下: 子组件是一篇文章的结构父组件在调用子组件是给文章插入标题,正文,时间信息 示例代码如下: <di…

随机森林算法详解

随机森林算法详解 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;通过构建多个决策树并将它们的预测结果结合起来&#xff0c;来提高模型的准确性和稳定性。随机森林在分类和回归任务中都表现出色&#xff0c;广泛应用于各类机器学习问题。本文…

MySQL功能测试-之应用工程

MySQL功能测试-之应用工程 前言pom.xmlapplication.yml 文件common.vo 包ResultVO config 包properties 包DruidConfigPropertyDruidMonitorProperty AutoFillMetaObjectHandlerDruidConfigFluxConfigurationMyBatisPlusConfig controller 包ClientControllerDruidControllerWe…

Python开发日记--手撸加解密小工具(2)

目录 1. UI设计和代码生成 2.运行代码查看效果 3.小结 1. UI设计和代码生成 昨天讨论到每一类算法设计为一个Tab&#xff0c;利用的是TabWidget&#xff0c;那么接下来就要在每个Tab里设计算法必要的参数了&#xff0c;这里我们会用到组件有Label、PushButton、TextEdit、Ra…

RSA 加密算法的基础数论、基本原理与 Python 实现

Title: RSA 加密算法的基础数论、基本原理与 Python 实现 文章目录 前言I. 数学原理1. 整数环2. 单位元3. 欧拉定理 II. 算法原理1. 扩展欧几里得算法2. RSA 非对称加密算法 III. 算法实现1. 源代码2. 测试结果 总结参考文献 前言 1977 年美国 MIT 的三位数学家 Ronald L. Riv…

gunicorn超时报错[CRITICAL] WORKER TIMEOUT

一. 问题描述 2024-06-18T08:40:39.858804039Z [2024-06-18 08:40:39 0000] [1] [CRITICAL] WORKER TIMEOUT (pid:332) 2024-06-18T08:40:40.918093090Z [2024-06-18 08:40:40 0000] [1] [ERROR] Worker (pid:332) was sent SIGKILL! Perhaps out of memory?二. 原因分析 从…

企业如何做好供应链管理工作?8个步骤及应用详解!

供应链就是采购把东西买进来&#xff0c;生产去加工增值&#xff0c;物流去配送给客户&#xff0c;环环相扣&#xff0c;就形成了供应链。它是将供应商&#xff0c;制造商&#xff0c;分销商直到最终用户连成一个整体的功能网链结构。 而供应链管理就是做好每个环节的管理&…

前沿重器[50] | 聊聊搜索系统3:文档内容处理

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

【Maven】项目的Maven插件报错

1. 找到本地maven库 2. 删除本地插件 3. 在IDEA上更新pom.xml

【简易版tinySTL】 deque容器

文章目录 基本概念功能思路数据结构循环数组实现 代码实现deque.htest.cpp 代码详解变量push_frontpush_backpop_front、pop_backoperator[]clearprintElementsresize 本实现版本 和 C STL标准库实现版本的区别&#xff1a; 基本概念 功能&#xff1a; 双端数组&#xff0c;可…

300PLC连接Modbus转Profibus网关与阀岛modbusRTU通讯

一、概况 300PLC作为常见的控制器设备&#xff0c;在与阀岛Modbus RTU通讯时&#xff0c;通常需要借助Modbus转Profibus网关&#xff08;XD-MDPB100&#xff09;来实现连接和数据交换。PLC通过Modbus转Profibus网关&#xff08;XD-MDPB100&#xff09;与阀岛Modbus RTU通讯是比…

无约束动态矩阵控制(DMC)

0、前言 动态矩阵控制&#xff08;Dynamic Matrix Control&#xff0c;DMC&#xff09;是一种典型的模型预测控制方法&#xff0c;其不需要被控对象的数学模型&#xff0c;只需要获取被控对象的阶跃响应序列即可实现控制效果&#xff0c;但其需要被控对象是渐近稳定的。 1、稳…

PTA - 编写函数计算薪资

某公司销售员底薪为5000&#xff0c;销售业绩与利润提成的关系如下表所示&#xff08;计量单位&#xff1a;元&#xff09; 编写函数&#xff0c;计算员工月薪。 函数接口定义&#xff1a; salary(sales) 其中 参数 sales表示员工的月销售业绩。 裁判测试程序样例&#xff…

Ranger配置图片及json文件预览

文章目录 前言下载apt下载pip下载 配置使用json文件预览方法一 修改scope用cat预览方法二 安装jq预览配置ranger 图片文件预览方法一 使用img2txt预览方法二 使用fim预览配置ranger 总结 前言 本文主要讲解Ranger12如何配置json及图片的预览设置&#xff0c;如下是ranger的介绍…

RX数据集成:信创生态下的平滑过渡方案

过去&#xff0c;众多中国企业倾向于采用国际供应商的数据集成产品与方案。其中Informatica作为行业翘楚&#xff0c;以其卓越性能和技术领先地位赢得了全球500强中95%企业的青睐。在中国市场上&#xff0c;众多企业同样信赖并采纳其解决方案。然而&#xff0c;随着国际环境的演…

数学建模基础:线性模型

目录 前言 一、线性方程组 二、线性规划 三、线性回归 四、线性模型的应用 五、实例示范&#xff1a;医疗成本预测 步骤 1&#xff1a;导入数据 步骤 2&#xff1a;数据预处理 步骤 3&#xff1a;建立多元线性回归模型 步骤 4&#xff1a;模型验证 步骤 5&#xff1…

C++多重继承,虚基类与友元

一.多重继承 就是一个类继承多个基类&#xff1b; class <派生类名>&#xff1a;<派生方式1><基类名1>,<派生方式n><基类名n> class Derived:public:Base1,public:Base2 上述形式&#xff1a;基类之间由逗号隔开&#xff0c;且必须指明继承方式…