RISC-V AIA学习2---IMSIC
我在学习文档这章时,对技术术语不太理解,所以用比较恰当的比喻来让自己更好的理解。
比较通俗的理解:
将 RISC-V 系统比作一个工厂:
- hart → 工厂的一条独立生产线
- IMSIC → 每条生产线配备的「订单接收员」
- MSI 中断 → 客户通过电子邮件(内存写入)发送的加急订单
1. IMSIC 的角色定位
- 专属服务:每条生产线(hart)都有自己的订单接收员(IMSIC),负责处理专属订单
- 订单类型:只接收 MSI 订单(通过特定内存地址写入触发的中断)
- 订单处理:
- 接收订单(内存写入操作)
- 记录订单状态(pending 位)
- 检查订单是否被允许接收(enable 位)
- 通知生产线处理订单(触发中断)
2. 硬件接口
- 内存映射寄存器:相当于「订单信箱」
- 客户(设备)通过写入特定内存地址发送订单
- 每个 IMSIC 可能有多个信箱(地址)
- CSR 寄存器:相当于「控制台界面」
- 生产线操作员(软件)通过 CSR 配置接收规则
- 例如:设置哪些订单可以接收(enable 位)、查看待处理订单(pending 位)

3. 典型工作流程
- 设备发送订单:
- 向特定内存地址(如 0x1000)写入数据(如 0x05)
- 这表示:给生产线 0 的 S 模式发送 ID=5 的中断
- IMSIC 处理:
- 检查该内存地址是否属于自己的信箱
- 在 S 模式的中断文件中找到 ID=5 的格子,标记为待处理(pending=1)
- 检查该 ID 是否被允许接收(enable=1)
- 通知 hart:
- 如果 pending 和 enable 都为 1,触发 S 模式中断
- hart 暂停当前任务,跳转到中断处理程序
4. 为什么选择 IMSIC?
- 精准控制:每个中断可以精确指定目标 hart 和特权级别
- 高效处理:内存写入比物理线路更快,适合高并发场景
- 灵活扩展:通过软件配置即可新增中断类型,无需硬件改动
一、 Interrupt files and interrupt identities
工厂里有不同级别的管理人员,对应 RISC - V 里的不同特权等级。
比如有最高管理层(M 模式)、普通管理层(S 模式),如果工厂还设有虚拟分厂(对应实现了 hypervisor extension),就还有虚拟分厂的管理层(VS 模式)。
每个任务接收员(IMSIC)都有不同的任务清单(interrupt file),分别对应不同级别的管理人员。
如果生产线只支持最高管理层(仅 M 模式),任务接收员就只有一份最高管理层的任务清单;
如果支持普通管理层(S 模式),就会有最高管理层和普通管理层两份任务清单;
要是还设立了虚拟分厂(H 模式),除了前面两份清单,还会有虚拟分厂的任务清单(guest interrupt file)。
每个任务清单(interrupt file)由两个数组组成。
一个是待处理任务记录数组(interrupt pending array),标记着已经收到但还没处理的任务;
另一个是允许接收任务数组(interrupt enable array),决定了生产线愿意接收哪些任务。
外部中断就像是从工厂外部来的任务,需要有明确的标识。
主要标识(major identity)就像是任务的大分类,比如最高管理层任务(M 模式下外部中断,major identity 为 11)、普通管理层任务(S 模式下外部中断,major identity 为 9)等;
次要标识(minor identity)就是任务编号(interrupt ID),主次标识结合起来,就能准确表示某一个具体的外部中断,就像知道是最高管理层收到的关于某个具体设备(如串口)的任务。
主次标识组合
- 主标识(Major Identity):部门编号(M=11,S=9,VS=10)
- 次标识(Minor Identity):订单编号(1-2047)
- 示例:M级+订单5 表示最高管理层的第 5 类紧急订单
编号规则
- 同一部门内,订单编号越小优先级越高(如订单 1 比订单 2 紧急)
- 不同部门的订单编号独立(M 级订单 5 和 S 级订单 5 是不同类型)
中断文件的配置灵活性
1. 大小限制
- 最小:63 个订单(1 个寄存器)
- 最大:2047 个订单(64 个寄存器)
- 示例:
M 级账本可能支持 2047 个订单,S 级支持 1023 个,VS 级支持 511 个
2. 跨生产线差异
- 不同生产线(hart)的账本大小可不同
- 生产线 0 的 M 级账本支持 2047 个订单
- 生产线 1 的 M 级账本可能只支持 1023 个
3. 虚拟分厂限制
- 同一生产线的所有虚拟分厂(VS 级)账本大小必须相同
- 生产线 0 的所有 VS 级账本均支持 511 个订单
配置建议
- 权限控制:只有最高管理层(M 级)有权修改账本数量和大小
- 避免冲突:软件可重复使用相同订单编号(如 M 级订单 5 和 S 级订单 5 独立)
二、MSI 编码规则
1. 标准化格式
- 地址限制:只能发送到工厂的低区(低 4GB 内存)
- 类似:国际邮件只能寄到某个国家的特定区域
- 数据限制:订单编号用 16 位数字(高位补零)
- 类似:快递单号只能用 16 位,多余位数自动忽略
2. 地址的作用
- 目标 hart:工厂区号(如 0 号区代表生产线 0)
- 特权级别:楼层编号(M 层 = 11 楼,S 层 = 9 楼)
- 虚拟 hart:虚拟分厂编号(如分厂 A、分厂 B)
3. 数据的作用
- 中断标识:订单编号(1-2047)
- 编号越小优先级越高(如订单 1 比订单 2 紧急)
- 次要 ID:与特权级别(主 ID)组合唯一标识中断
- 示例:S 层 9 楼的订单 5 → 主 ID=9,次 ID=5
IMSIC 处理流程
- 设备发送订单:
- 向地址0x1000写入数据0x05
- 含义:给生产线 0 的 S 层 9 楼发送订单 5
- 订单中心分拣:
- IMSIC 检查地址是否属于自己的管辖范围
- 在 S 层的中断文件中找到订单 5 的格子,标记为 “待处理”
- 生产线响应:
- 若订单 5 被允许接收(enable=1),触发 S 层中断
- 生产线暂停当前任务,处理该订单
虚拟化场景
- 客户地址:虚拟分厂使用自己的地址(如分厂 A 的地址0xA000)
- 地址翻译:IOMMU 像翻译员,将虚拟地址转换为物理地址
- 示例:0xA000 → 实际地址0x1000(生产线 0 的 S 层)
- 订单隔离:虚拟分厂的订单只能投递到自己的中断文件
三、Interrupt priorities
1. 核心规则
中断优先级由中断标识号直接决定:
- 标识号越小 → 优先级越高
(类似:快递单号越小,包裹越紧急)
2. 设计逻辑
a. 软件自由分配
- 软件可以像给快递分配单号一样,为不同中断分配标识号:
- 紧急中断(如电源故障)→ 分配单号 1
- 普通中断(如磁盘读写)→ 分配单号 100
b. 为什么不动态调整?
- 动态优先级需要额外硬件:
(例如:每个中断单独存储优先级值) - 实际需求低:
大多数系统中,中断优先级固定即可,动态调整不常用。
c. 低标识号的优势
- 跨系统兼容性:
所有系统至少支持 1-63 号中断(如 1 号始终是最高优先级)
(类似:所有快递公司都保证 1 号包裹最紧急) - 简化管理:
最高优先级中断的标识号固定,无需适配不同系统。
3. 实际场景举例
场景 1:服务器中断处理
- 高优先级中断:网络流量处理 → 标识号 1
- 中优先级中断:磁盘写入完成 → 标识号 50
- 低优先级中断:风扇转速调整 → 标识号 200
优势:
1 号中断始终优先处理,即使其他系统的中断文件支持更多标识号。
场景 2:嵌入式设备
- 仅支持 63 个中断:
1 号 → 传感器数据采集(最高优先级)
63 号 → 日志记录(最低优先级)
4. 常见疑问解答
- 为什么优先级与标识号顺序相反?
因为低标识号在所有系统中必然存在,而高标识号可能因系统而异。例如:- 系统 A 支持 2047 个中断,最高优先级是 1 号
- 系统 B 仅支持 63 个中断,最高优先级还是 1 号
- 软件如何调整优先级?
通过重新分配标识号实现。例如:- 原 1 号(高优先级)改为 100 号
- 原 100 号改为 1 号
- 动态优先级是否可能?
硬件不直接支持,但软件可通过重新分配标识号间接实现。
5. 总结比喻
中断优先级就像学校的作业等级:
- 标识号 1 → 红色紧急作业(必须优先完成)
- 标识号 100 → 蓝色普通作业(有空再做)
- 软件角色:老师分配作业等级
- 硬件保证:所有班级都保证红色作业优先
这种设计确保了关键中断的及时响应,同时允许软件灵活管理,平衡了通用性和效率。
四、中断控制器重置和状态变化
1. 重置后的状态
a. 基本规则
- 所有账本初始化:
停电后重新启动,所有账本(中断文件)被清空,但账本结构保持有效(表格存在但无内容)。- 例外:M/S 级的 eidelivery 寄存器可能保留部分配置(类似工厂总控室的紧急预案)。
b. 软件影响
- 不可依赖默认值:
重启后账本中的订单(中断状态)是未指定的(可能为随机值或全 0),软件必须重新配置允许接收的订单(enable 位)。- 示例:
重启后,S 级账本的 enable 位可能全部为 0,需手动设置允许接收订单。
- 示例:
2. 特权模式启用时的状态
a. S 模式启用
- 场景:工厂新增普通管理层(S 级),原关闭状态→开启。
- 状态变化:
- S 级账本被初始化(表格存在但无内容)。
- 原有 M 级账本状态不受影响。
b. H 模式启用
- 场景:工厂新增虚拟分厂(VS 级),原关闭状态→开启。
- 状态变化:
- 所有虚拟分厂的账本(guest interrupt files)被初始化。
- M/S 级账本状态不受影响。

IMSIC 重置与模式启用类似于工厂管理调整:
- 工厂停电重启 → 所有订单记录清空,但部门结构保留(需重新接收订单)。
- 新增普通管理层 → 该部门的账本重建,旧订单不保留。
- 新增虚拟分厂 → 虚拟分厂的账本全部重建,与物理工厂无关。
这种设计确保系统在模式切换或故障恢复时,状态清晰可控,避免历史配置引发的问题。
五、Memory region for an interrupt file
1.核心概念类比
- IMSIC:快递处理中心
- 中断文件:快递分类账本(按部门 / 虚拟分厂)
- 内存区域:快递柜(每个中断文件一个柜子)
2. 快递柜结构
-
地址范围:每个柜子占 4 层(4KB),每层 32 个格子(32 位)
-
寄存器布局:
位置 功能 说明 0 层 小端模式写口(le) 接收小端格式的快递单号(如 1→01 00 00 00) 1 层 大端模式写口(be) 接收大端格式的快递单号(如 1→00 00 00 01) 2-3 层 保留区(只读 0) 未使用,不能存放快递 -
关键规则:
- 只能从每层的整格存取快递(自然对齐 32 位)
- 其他操作(如存取半格、非对齐格)会被拒收或报错
3. 快递单号处理
a. 有效单号写入
- 小端系统:
写单号 5 → 底层格子显示05 00 00 00→ 对应中断 ID=5 标记为待处理 - 大端系统:
写单号 5 → 底层格子显示00 00 00 05→ 对应中断 ID=5 标记为待处理
b. 无效单号处理
- 单号 0 或超过 2047 → 快递被拒收(忽略写入)
- 格式错误(如大端系统写入小端格式)→ 快递被拒收
4. 读写行为
- 读取操作:
无论从哪个格子读取,都返回空(0) - 写入延迟:
- 快递员(设备)放入柜子后,系统最终会处理,但可能有延迟
- 若 hart 自己写入自己的柜子,可能观察到延迟(如写完单号后,pending 位过一会儿才生效)
5. 订单顺序保证
- 全局顺序:
多个快递按写入顺序处理(如先写 ID=5,再写 ID=3 → 先处理 ID=5) - 内存序保证:
类似快递员必须按顺序发货,确保前一个订单完成后,后一个订单才被处理
6. 兼容性设计
- 大小端支持:
不同地区的快递员可按自己的格式(大端 / 小端)写入,系统自动识别 - 扩展预留:
4 层柜子为未来新增功能预留空间(如增加更多写口)
7. 常见疑问解答
-
为什么需要两个写口?
支持不同地区的快递员(设备)按自己的格式发送订单(如小端设备用 le 口,大端设备用 be 口)。 -
保留区为什么不能用?
防止软件误操作破坏系统,确保中断处理的稳定性。 -
写入后立即生效吗?
不一定,但最终会生效。系统保证顺序,但可能因内存延迟导致时间差。
8. 总结比喻
中断文件内存区域就像智能快递柜:
- 每个部门 / 虚拟分厂有专属柜子(中断文件)
- 快递员(设备)通过指定口写入单号(MSI 地址 + 数据)
- 系统按顺序处理快递(中断),确保先到先得
- 保留区和错误处理机制保证系统安全稳定
这种设计既满足硬件兼容性,又通过标准化结构简化了软件配置,适合现代多核系统的中断管理需求。
六、Arrangement of the memory regions of multiple interrupt files中断文件内存区域布局
1. 核心概念类比
- 地址空间:整栋公寓楼(物理内存)
- hart:每个公寓单元(独立处理器核心)
- 中断文件:单元内的信箱(按楼层分类)
- 组划分:不同单元楼(如不同芯片或模块)
2. 地址布局规则
a. 分层管理
- 机器级信箱(M 层):位于公寓楼的特定区域(如 1-10 层)
- 所有 hart 的 M 层信箱集中管理,方便最高权限(物业)统一维护。
- 监督级信箱(S 层):位于另一区域(如 11-20 层)
- 操作系统(住户)可通过一个权限设置(PMP 表项)访问所有 S 层信箱。
- 来宾信箱(VS 层):与 S 层连续排列(如 S 层之后的楼层)
- 每个虚拟住户(虚拟机)的信箱按编号顺序排列(如 S 层→VS1→VS2→…)。
b. 地址计算公式
- 机器级地址:
地址 = A + hart编号 × 4KB- A:M 层起始地址(如公寓 1 层)
- hart 编号:单元号(如单元 0→地址 0x1000,单元 1→地址 0x2000)
- 监督级地址:
地址 = B + hart编号 × 4KB- B:S 层起始地址(如公寓 11 层)
3. 组划分场景
- 跨楼单元:
不同单元楼(如 A 栋、B 栋)的地址空间独立:- 机器级地址:
组号 × 大跨度 + A + hart编号 × 4KB - 监督级地址:
组号 × 大跨度 + B + hart编号 × 4KB - 大跨度:楼间距(如 A 栋起始地址 0x100000,B 栋 0x200000)
- 机器级地址:
4. 设计目的
a. 权限管理简化
- PMP 表项:
操作系统只需设置一个权限规则,即可允许访问所有 S 层和 VS 层信箱(因为它们集中在连续区域)。- 类比:住户只需一把钥匙,即可打开所有 S 层邮箱。
b. 扩展性与兼容性
- 地址对齐:
基地址(A/B)按大跨度对齐(如 4KB、更大的 2^C),确保未来扩展时地址不会冲突。- 类比:预留足够的楼层空间,方便未来增加新信箱。
c. 多组支持
- 跨楼访问:
不同组(楼)的地址空间独立,避免干扰。- 类比:A 栋住户无法误操作 B 栋的信箱。
5. 示例说明
场景 1:单组 4 个 hart
- M 层地址:
hart0 → 0x1000
hart1 → 0x2000
hart2 → 0x3000
hart3 → 0x4000 - S 层地址:
hart0 → 0x11000
hart1 → 0x12000
...
场景 2:两组(楼)
- 组 0(A 栋):
M 层起始地址 0x100000
S 层起始地址 0x200000 - 组 1(B 栋):
M 层起始地址 0x300000
S 层起始地址 0x400000

地址空间布局就像智能公寓管理系统:
- 分层管理:不同权限的信箱(M/S/VS)分布在不同楼层,便于权限控制。
- 地址公式:每个 hart 的信箱地址按单元号和楼层规则自动生成。
- 组划分:不同楼的地址空间独立,支持跨楼扩展而不冲突。
这种设计既简化了系统管理,又保证了安全性和扩展性,特别适合现代多核和虚拟化环境。
七、IMSIC 相关 CSR
软件主要通过第 2 章中介绍的控制状态寄存器(CSR)来访问处理器核心(hart)的传入消息信号中断控制器(IMSIC)
1. 核心概念类比
- IMSIC:电视台的信号接收中心
- 特权级别:不同电视频道(M/S/VS)
- CSR 寄存器:控制遥控器(*iselect)和当前频道显示(*ireg)
2. CSR 寄存器的作用
*a. 遥控器(iselect)
- 功能:选择要操作的 “电视频道”(寄存器)
- 取值范围:
0x70-0xFF:外部中断相关寄存器(如 eip/eie/eidelivery)0x30-0x3F:中断优先级设置
- 特权级别对应:
miselect:M 级遥控器siselect:S 级遥控器vsiselect:VS 级遥控器(需虚拟化支持)
*b. 当前频道显示(ireg)
- 功能:显示或修改当前选中的寄存器内容
- 示例:
- 遥控器选
0x80→ 当前显示 eip0 寄存器(中断 ID 1-31 的 pending 位)
- 遥控器选
3. 关键寄存器说明
a. eip 数组(中断待处理位)
- 寄存器范围:
eip0(0x80)到eip63(0xBF) - 作用:记录中断是否已到达但未处理(1 = 待处理,0 = 已处理)
- 类比:电视节目录制状态(红点标记录制中)
b. eie 数组(中断使能位)
- 寄存器范围:
eie0(0xC0)到eie63(0xFF) - 作用:控制是否接收特定中断(1 = 允许,0 = 禁止)
- 类比:家长控制功能(允许 / 禁止特定频道)
c. eidelivery(中断传递配置)
- 地址:
0x70 - 作用:设置中断传递模式(如电平触发 / 边沿触发)
- 类比:电视信号传输方式(高清 / 标清)
d. eithreshold(中断阈值)
- 地址:
0x72 - 作用:设置触发中断的最低优先级
- 类比:音量阈值(低于阈值不播放)

4. 访问规则
a. 有效范围
- eip/eie:
0x80-0xBF(eip0-63)和0xC0-0xFF(eie0-63) - 保留地址:
0x71、0x73-0x7F→ 从对应的ireg(mireg sireg vsireg)读取返回 0,写入忽略
b. 特权级别隔离
- M 级遥控器:只能操作 M 级寄存器(如
miselect选0x80→ 访问 M 级 eip0) - S 级遥控器:只能操作 S 级寄存器(如
siselect选0x80→ 访问 S 级 eip0)
c. 虚拟化支持
- VS 级遥控器:通过
hstatus.VGEIN选择目标虚拟分厂的中断文件 - 示例:
VGEIN=2→vsiselect选0x80→ 访问虚拟分厂 2 的 eip0
5. 典型操作流程
- 设置中断使能:
siselect=0xC0(eie0) →sireg写入0x00000001→ 允许 S 级中断 ID=1
- 触发中断:
- 设备向
0x1000写入0x01→ S 级 eip0 的 bit1 置 1
- 设备向
- 处理中断:
stopi查询最高优先级中断 → 发现 ID=1 → 执行中断服务程序

CSR 寄存器就像智能电视遥控器:
- 遥控器(*iselect):选择要操作的频道(寄存器)
- 屏幕显示(*ireg):显示或修改当前频道内容(寄存器值)
- 频道分类:
- M 级频道:处理硬件紧急中断(如电源故障)
- S 级频道:处理操作系统中断(如磁盘读写)
- VS 级频道:处理虚拟机中断(如虚拟网卡请求)
这种设计让软件能够灵活管理中断,同时通过分层控制提高系统安全性和可扩展性。
八、间接访问中断文件寄存器
本节描述了中断文件的寄存器,这些寄存器是通过iselect 控制状态寄存器(miselect、siselect 或 vsiselect)及其对应的ireg 控制状态寄存器(mireg、sireg 或 vsireg)间接访问的。这些间接访问的宽度始终为当前的 XLEN,对于 RV32 代码来说是 32 位,对于 RV64 代码来说是 64 位。
1.关键寄存器功能
a. 中断传递开关(eidelivery)
eidelivery是一个写时即读锁定(WARL)寄存器。它的主要作用是控制从当前中断文件产生的中断是否会从传入消息信号中断控制器(IMSIC)传递到与之相连的处理器核心(hart),从而使这些中断在 hart 的机器中断挂起寄存器(mip)或虚拟机通用外部中断挂起寄存器(hgeip)中显示为待处理的外部中断。此外,该寄存器还可以选择性地支持将平台级中断控制器(PLIC)或高级平台级中断控制器(APLIC)产生的中断直接传递给相连的 hart。
- 作用:控制中断是否从 IMSIC 传递到 hart
- 档位说明:
- 0:关闭(无论中断文件里有什么中断产生,都不会传递到 hart)
- 1:开启(中断文件产生的中断会正常传递到 hart,在
mip或hgeip中显示为待处理状态) - 0x40000000:备用(当
eidelivery支持这个值时,系统中的特定 PLIC 或 APLIC 可以作为与当前中断文件处于相同特权级别的备用外部中断控制器。当该寄存器的值为 0x40000000 时,中断文件的功能就如同eidelivery的值为 0 一样,不再起作用,而是由 PLIC 或 APLIC 来为 hart 提供该特权级别的待处理外部中断。guest中断文件不支持eidelivery的值为 0x40000000。这意味着在guest中断的场景下,不能使用 PLIC 或 APLIC 作为替代的外部中断控制器)
- 复位默认:优先使用备用模式(若支持),否则随机开启 / 关闭
b. 中断阈值过滤器(eithreshold)
eithreshold 是一个WLRL(Write-Only Read-Latch)寄存器,用于设置中断触发的优先级阈值。它决定了只有中断标识号(Interrupt Identity Number)小于当前阈值的中断才会被传递到 hart(处理器核)。
- 作用:设置最低优先级(最高中断 ID)的中断才会被传递
- 示例:
- 阈值设为 100 → 仅 ID≤100 的中断会被传递(ID>100 的即使使能也无效)
应用场景
- 简化中断管理:通过设置阈值,可快速屏蔽高编号的中断(如外设中断),无需逐个修改 eie 寄存器。
- 实时系统:在需要优先处理低编号中断(如定时器、紧急故障)的场景中,通过阈值实现优先级过滤。
c. 中断待处理表(eip 数组)
- 结构:
- 32 位系统:每个 eipk 管理 32 个中断(如 eip0 管 ID1-31,eip1 管 ID32-63)
- 64 位系统:每个 eipk 管理 64 个中断(奇數寄存器不存在,eip0 管 ID1-63,eip2 管 ID64-127)
- 读写规则:
- 未实现的中断位始终为 0(例如,若系统仅支持 0~63 号中断,则
eip0的所有位有效,而eip2的所有位均为 0,除非中断扩展到 64~127 号)
- 若通过
*iselectCSR 选择奇数编号的寄存器(如0x81、0x83等),访问*iregCSR 会触发非法指令异常。
- 未实现的中断位始终为 0(例如,若系统仅支持 0~63 号中断,则
d. 中断使能表(eie 数组)
- 结构:与 eip 数组对应,控制是否允许中断传递
- 示例:
- eie0.bit1=1 → 允许 ID=1 的中断
典型操作流程
- 开启中断传递:
miselect=0x70→mireg=1(eidelivery=1)
- 设置阈值:
miselect=0x72→mireg=100(eithreshold=100)
- 使能中断:
miselect=0xC0→mireg=0x00000001(eie0.bit0=1)
- 触发中断:
- 设备写入
0x1000(eip0.bit0=1) → hart 处理 ID=1 的中断
- 设备写入
间接访问寄存器就像智能交通控制系统:
- eidelivery:总开关,控制是否使用 IMSIC 或传统交通灯
- eithreshold:过滤器,只允许高优先级中断通行
- eip/eie 数组:实时监控和控制每个路口的交通状态
- 地址分组:不同区域的交通系统独立管理,提高效率和安全性
这种设计让中断管理更灵活高效,同时兼容传统系统,适合现代多核和虚拟化环境的需求。
九、Top external interrupt CSRs(mtopei stopei vstopei)
1. 中断处理的三个 "管家"(CSR 寄存器)
- mtopei:专门管理机器级别的中断(最底层的硬件中断)
- stopei:管理系统级中断(如果开启了系统模式)
- vstopei:管理虚拟机级中断(如果开启了虚拟化功能,且当前处于某个虚拟机环境)
2. 它们的作用
这些寄存器就像中断的 "调度员",会告诉 CPU:
- 当前哪个中断最紧急(优先级最高)
- 这个中断是否已经被处理(是否挂起)
- 是否允许处理这个中断(是否使能)
3. 如何判断中断是否存在?
当读取这些寄存器时:
- 如果返回 0,说明两种情况:
a. 没有正在等待处理的中断(挂起且使能)
b. 或者设置了优先级阈值(eithreshold),但没有符合条件的中断 - 如果返回非零,格式如下:
高位(26-16 位):中断编号(越小优先级越高)
低位(10-0 位):优先级(和编号相同,这里是冗余设计)
4. 如何处理中断?
正确的做法是:
- 读取寄存器(得到当前最高优先级中断编号)
- 立即清除该中断的挂起状态(防止重复触发)
5. 为什么必须同时读写?
如果分开操作(先读再写):
- 可能在两次操作之间出现更高优先级的新中断
- 导致第二次写操作会错误地清除新中断,而不是之前读到的那个
- 结果就是原来的中断被漏掉,永远无法处理
6. 如何安全操作?
推荐使用原子指令:
- csrrw:同时完成读和写(自动清除读到的中断)
- 其他原子指令(csrrs/csrrc)也可以,但要注意操作方式
7. 如果必须分开操作怎么办?
使用另外两个寄存器:
- *siselect:选择要操作的中断组
- *sireg:直接清除对应的中断位
这种方式可以避免中间出现新中断的问题
总结:
这些寄存器就像智能的中断调度员,会自动帮你找到当前最紧急的中断。但操作时必须注意:
- 必须同时完成读取和清除操作(用原子指令)
- 分开操作会导致中断丢失
- 特殊情况需要分开操作时,要用专用寄存器处理
举个例子:
就像医院的分诊台,mtopei/stopei/vstopei 相当于护士站的叫号系统。护士会告诉你当前最紧急的病人(最高优先级中断),你必须立即处理这个病人并标记已处理。如果先问护士得到病人 A,然后去处理时,中间来了更紧急的病人 B,这时如果直接去标记已处理,可能错误地标记了 B,导致 A 永远没被处理。正确的做法是护士在告诉你 A 的同时,自动把 A 的状态标记为已处理。
十、Interrupt delivery and handling
1. 每个中断文件都有个总开关(eidelivery 寄存器):
- 开关关闭(0):无论有没有中断请求,信号灯都不亮
- 开关打开(1):只有满足以下条件时信号灯才会亮:
a. 中断处于待处理状态(eip=1)
b. 中断已被使能(eie=1)
c. 中断优先级足够高(ID < eithreshold,如果设置了门槛)
2. 中断处理的标准流程
当 CPU 收到中断信号时,会按以下步骤处理:

中断标识(Interrupt identity)存放在读取值的第 26 位到第 16 位。当执行i = i >> 16时,就相当于把读取值整体向右移动 16 位,从而提取出了中断标识。
相关文章:
RISC-V AIA学习2---IMSIC
我在学习文档这章时,对技术术语不太理解,所以用比较恰当的比喻来让自己更好的理解。 比较通俗的理解: 将 RISC-V 系统比作一个工厂: hart → 工厂的一条独立生产线IMSIC → 每条生产线配备的「订单接收员」MSI 中断 → 客户通过…...
2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题全过程文档加程序
2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现: 甲骨文是我国目前已知的最早成熟的文字系统,它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值,不仅对中国文…...
Python----计算机视觉处理(Opencv:霍夫变换)
一、霍夫变换 霍夫变换是图像处理中的一种技术,主要用于检测图像中的直线、圆或其他形状。其基本思想就是将图像空间中的点映射到参数空间中,通过在参数空间中寻找累计最大值来实现对特定形状的检测。 二、 霍夫直线变换 那么对于一个二值化后的图形来说…...
多语言生成语言模型的少样本学习
摘要 大规模生成语言模型,如GPT-3,是极具竞争力的少样本学习模型。尽管这些模型能够共同表示多种语言,但其训练数据以英语为主,这可能限制了它们的跨语言泛化能力。在本研究中,我们在一个涵盖多种语言的语料库上训练了…...
k8s存储介绍(二)Secret
Kubernetes(K8s)提供了一种安全的方式来存储和管理敏感信息,如密码、OAuth 令牌和 SSH 密钥,这就是 Secret。使用 Secret 可以避免将敏感数据硬编码到 Pod 规范或容器镜像中,从而提高安全性和可管理性。 1. Secret 的…...
代理IP与AI的碰撞:网络安全新防线解码
目录 一、代理IP:网络世界的“隐形斗篷” 二、AI加持:代理IP的“智能升级包” 三、协同作战:五大核心应用场景 场景1:智能风控系统 场景2:跨境电商竞品分析 场景3:智能汽车安全测试 场景4:…...
QT开发(4)--各种方式实现HelloWorld
目录 1. 编辑框实现 2. 按钮实现 前面已经写过通过标签实现的了,所以这里就不写了,通过这两个例子,其他的也是同理 1. 编辑框实现 编辑框分为单行编辑框(QLineEdit)双行编辑框(QTextEdit)&am…...
UniApp 生命周期钩子的应用场景
UniApp 生命周期钩子的应用场景 应用生命周期钩子的应用场景 onLaunch 应用初始化:在应用第一次启动时进行全局数据的初始化,比如设置全局配置信息、初始化用户登录状态等。例如,在应用启动时检查本地存储中是否有用户的登录信息࿰…...
macOS 安装 Miniconda
macOS 安装 Miniconda 1. Quickstart install instructions2. 执行3. shell 上初始化 conda4. 关闭 终端登录用户名前的 base参考 1. Quickstart install instructions mkdir -p ~/miniconda3 curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o…...
可发1区的超级创新思路(python\matlab实现):基于周期注意力机制的TCN-Informer时间序列预测模型
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等 二、模型整体介绍(本文以光伏功率预测为例) 1.1 核心创新点 本模型通过三阶段…...
Nordic Semiconductor 芯片(如 nRF52/nRF53 系列)的 VSCode 开发环境的步骤
目录 概述 1. 安装必要工具链 2. 安装 VSCode 扩展 3. 配置环境变量 4. 克隆/配置 Nordic SDK 5. 创建 VSCode 项目 6. 配置调试 7. 构建与烧录 8. 其他工具 总结 概述 本文主要介绍Nordic Semiconductor 芯片(如 nRF52/nRF53 系列)的 VSCode…...
Flutter 输入组件 Radio 详解
1. 引言 在 Flutter 中,Radio 是用于单选的按钮组件,适用于需要用户在多个选项中选择一个的场景,如表单、设置选项等。Radio 通过 value 和 groupValue 进行状态管理,并结合 onChanged 监听选中状态的变化。本文将介绍 Radio 的基…...
3.23学习总结
完成了组合Ⅲ,和电话号码的字母组合两道算法题,都是和回溯有关的,很类似。 学习了static的关键字和继承有关知识...
Spring Boot整合Activiti工作流详解
1. 概述 Spring Boot与Activiti的整合可以大大简化工作流应用的开发。Spring Boot提供了自动配置和依赖管理,而Activiti则提供了强大的工作流功能。通过整合,我们可以快速构建基于工作流的业务系统。 本文将详细介绍Spring Boot与Activiti的整合方法,并通过一个请假流程的…...
C# System.Text.Encoding 使用详解
总目录 前言 在C#编程中,处理字符串和字节数组之间的转换是一个常见的任务。System.Text.Encoding类及其派生类提供了丰富的功能,帮助开发者实现不同字符编码之间的转换。本文将详细讲解System.Text.Encoding类的使用方法,包括常用编码的介绍…...
力扣刷题-热题100题-第23题(c++、python)
206. 反转链表 - 力扣(LeetCode)https://leetcode.cn/problems/reverse-linked-list/solutions/551596/fan-zhuan-lian-biao-by-leetcode-solution-d1k2/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 记录前一个指针,当前指针&am…...
机器学习-基于KNN算法手动实现kd树
目录 一、概括 二、KD树的构建流程 1.循环选轴 2.选择分裂点 三、kd树的查询 1.输入我们要搜索的点 2.递归向下遍历: 3.记录最近点 4.回溯父节点: 四、KD树的优化与变种: 五、KD树代码: 上一章我们将了机器学习-手搓KN…...
Unity Shader 的编程流程和结构
Unity Shader 的编程流程和结构 Unity Shader 的编程主要由以下三个核心部分组成:Properties(属性)、SubShader(子着色器) 和 Fallback(回退)。下面是它们的具体作用和结构: 1. Pr…...
vue3 项目的最新eslint9 + prettier 配置
注意:eslint目前升级到9版本了 在 ESLint v9 中,配置文件已经从 .eslintrc 迁移到了 eslint.config.js 配置的方式和之前的方式不太一样了!!!! 详见自己的语雀文档:5、新版eslint9prettier 配…...
SAP GUI Script for C# SAP脚本开发快速指南与默认主题问题
SAP GUI Script for C# 快速指南 SAP 脚本的快速使用与设置. 解决使用SAP脚本执行后,默认打开的SAP是经典主题的问题 1. 解决默认主题问题 如果您使用的是SAP GUI 740,并遇到无法打开对话框的问题,请先将主题设置为经典主题(Classic Theme…...
JAVA泛型的作用
1. 类型安全(Type Safety) 在泛型出现之前,集合类(如 ArrayList、HashMap)只能存储 Object 类型元素,导致以下问题: 问题:从集合中取出元素时,需手动强制类型转…...
Git Flow 分支管理策略
优势 清晰的分支结构:每个分支都有明确的用途,便于团队协作。 稳定的 master 分支:生产环境代码始终稳定。 灵活的发布管理:通过发布分支和热修复分支,可以灵活管理版本发布和紧急修复。 主要分支 master 分支 代表…...
FFmpeg + Qt 简单视频播放器代码
一个基于 FFmpeg 4.x 和 Qt 的简单视频播放器代码示例,实现视频解码和渲染到 Qt 窗口的功能。 1)ffmpeg库界面,视频解码支持软解和硬解方式。 2)QImage/QPixmap显示视频图片。 1. Qt 项目配置(.pro 文件&…...
Unity跨平台构建快速回顾
知识点来源:人间自有韬哥在,豆包 目录 一、发布应用程序1. 修改发布必备设置1.1 打开设置面板1.2 修改公司名、游戏项目名、版本号和默认图标1.3 修改 Package Name 和 Minimum API Level 2. 发布应用程序2.1 配置 Build Settings2.2 选择发布选项2.3 构…...
【嵌入式学习2】内存管理
## C语言编译过程 预处理:宏定义展开、头文件展开、条件编译,这里并不会检查语法,将#include #define这些头文件内容插入到源码中 gcc -E main.c -o main.i 编译:检查语法,将预处理后文件编译生成汇编文件ÿ…...
密码学(Public-Key Cryptography and Discrete Logarithms)
Public-Key Cryptography and Discrete Logarithms Discrete Logarithm 核心概念:离散对数是密码学中一个重要的数学问题,特别是在有限域和循环群中。它基于指数运算在某些群中是单向函数这一特性。也就是说,给定一个群 G G G和一个生成元 …...
TDengine又新增一可视化工具 Perspective
概述 Perspective 是一款开源且强大的数据可视化库,由 Prospective.co 开发,运用 WebAssembly 和 Web Workers 技术,在 Web 应用中实现交互式实时数据分析,能在浏览器端提供高性能可视化能力。借助它,开发者可构建实时…...
【Linux文件IO】Linux中标准IO的API的描述和基本用法
Linux中标准IO的API的描述和基本用法 一、标准IO相关API1、文件的打开和关闭示例代码: 2、文件的读写示例代码:用标准IO(fread、fwrite)实现文件拷贝(任何文件均可拷贝) 3、文件偏移设置示例代码: 4、fgets fputs fget…...
深度学习篇---PaddleDetectionPaddleOCR
文章目录 前言1.代码2.代码介绍2.1 **导入模块**2.2 **配置区域**2.3 ExpressInfoProcessor类2.4 **主程序**: 3.使用说明3.1环境准备3.2模型准备3.3数据库初始化3.4串口配置3.5信息提取优化3.6注意事项 前言 本文简单介绍了PaddleDetection和PaddleOCR相结合的示例…...
Ant Design Vue Select 选择器 全选 功能
Vue.js的组件库Ant Design Vue Select 选择器没有全选功能,如下图所示: 在项目中,我们自己实现了全选和清空功能,如下所示: 代码如下所示: <!--* 参数配置 - 风力发电 - 曲线图 * 猴王软件学院 - 大强 …...
