RISC-V架构——中断处理和中断控制器介绍

1、ARM架构中断机制介绍

本文不是从零开始讲解中断,对于中断的基本知识不再赘述,对中断不是很了解可以先学习ARM中断的文章。参考博客:《ARM架构的外部中断介绍(S5PV210芯片)》;

2、RIAC_V架构的中断控制器架构

在这里插入图片描述

(1)CLINT:负责处理器核内部产生的中断,包括软件中断和时钟中断,这些中断都是不依赖外部硬件的;
(2)PLIC:负责外部中断的调度。比如:可以给外部中断设置优先级,当多个外部中断同时发生时,PLIC按优先级进行排序,将高优先级的中断号发生到处理器核进行处理;

3、中断处理中的关键问题

3.1、如何注册异常处理函数?

3.1.1、异常向量表基地址寄存器:mtvec寄存器

在这里插入图片描述

(1)将异常处理函数的地址写到mtvec寄存器中,低两位是模式位;
(2)当发生陷入时,硬件会自动跳转到mtvec寄存器中保存的函数地址执行;
补充:S模式也是类似的,有一个stvec寄存器;

3.1.2、异常向量表:直接访问模式

当M模式/S模式发生陷入时,硬件会自动跳转到异常向量表基地址寄存器中保存的地址处执行,需要在异常处理函数中读取mcause/scause寄存器开查询异常或者中断触发的原因;

3.1.2、异常向量表:向量访问模式

在这里插入图片描述

(1)中断触发后,同步异常会跳转到BASE(异常向量表基地址寄存器中保存的地址)处执行,异步异常(中断)会跳转到“BASE + 4 x 中断号”处执行。
(2)同步异常还是需要去查询mcause寄存器来知道是发生的哪个异常,而异步异常则是硬件直接跳转到对于的地址处执行。比如:发生M模式下的时钟中断,硬件会跳转到“BASE + 4 x 7”地址处执行。
总结:向量访问模式下,异步异常的处理效率会更高,因为是硬件直接跳转,但是构建异常处理函数也会更复杂;

3.2、发生异常时怎么跳转到异常处理函数执行?

(1)首先异常发生时跳转到异常处理函数时硬件完成的,软件只需要提前将异常处理函数地址写到异常向量表基地址寄存器中;
(2)硬件在跳转前会做一些处理。比如:报错当前PC到mepc中,把异常类型更新到mcause中等等;

3.3、怎么保护/恢复中断现场?

在异常处理函数的开始阶段保存异常上下文到栈中,包括通用寄存器、部分CSR寄存器;然后执行真正的处理异常的函数,异常处理完成,在返回前将栈中保存的异常上下文恢复;

3.4、异常处理函数中,怎么区分是哪个中断或者哪个异常?

进入到异常处理函数后,查询mcause和scause寄存器。

4、中断委托和中断注入

参考博客:《RISC-V架构——中断委托和中断注入》;

5、PLIC:中断控制器

5.1、中断控制器初始化

(1)设置中断优先级阈值。当发生的外部中断小于阈值时会被屏蔽,不会上报到处理器进行处理;
(2)设置各个中断的优先级和使能;

5.2、中断控制器工作流程

(1)当发生大于阈值的中断后,首先跳转到异常处理函数处执行,判断属于外部中断;
(2)读取中断请求寄存器(claim),查询发生的哪个外部中断;
(3)调用对应外部中断的处理函数;
(4)处理完中断后,写中断完成寄存器(complete),告诉PLIC中断控制器该中断已经处理完成;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt之自定义事件QEvent

在Qt中,自定义事件的步骤大概如下: 1.创建自定义事件,自定义事件需要继承QEvent 2.使用QEvent::registerEventType()注册自定义事件类型,事件的类型需要在 QEvent::User 和 QEvent::MaxUser 范围之间,在QEvent::User之前是预留给系统的事件 3.使用sendEvent() 和 postEv…

【软件安装】Linux系统中安装MySQL数据库服务

这篇文章,主要介绍如何在Linux系统中安装MySQL数据库服务。 目录 一、Linux安装MySQL 1.1、下载MySQL安装包 1.2、解压MySQL安装包 1.3、更改存放目录 1.4、创建用户组和用户 1.5、创建数据目录data 1.6、创建my.cnf配置文件 1.7、初始化数据库 1.8、添加m…

C# 基于腾讯云人脸核身和百度云证件识别技术相结合的 API 实现

目录 腾讯云人脸核身技术 Craneoffice.net 采用的识别方式 1、活体人脸核身(权威库): 2、活体人脸比对: 3、照片人脸核身(权威库): 调用成本 百度云身份证识别 调用成本 相关结合点 核心代码 实现调用人脸核身API的示例 实现调用身…

微信小程序设置 wx.showModal 提示框中 确定和取消按钮的颜色

wx官方提供的 showModal 无疑是个非常优秀的选择提示工具 但是 我们还可以让他的颜色更贴近整体的小程序风格 cancelColor 可以改变取消按钮的颜色 confirmColor 则可以控制确定按钮的颜色 参考代码如下 wx.showModal({cancelColor: #0000FF,confirmColor: #45B250,content:…

行业追踪,2023-10-25

自动复盘 2023-10-25 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

如何构建一个外卖微信小程序

随着外卖行业的不断发展,越来越多的商家开始关注外卖微信小程序的开发。微信小程序具有使用方便、快速上线、用户覆盖广等优势,成为了商家们的首选。 那么,如何快速开发一个外卖微信小程序呢?下面就让我们来看看吧! 首…

Python Opencv实践 - 入门使用Tesseract识别图片中的文字

做车牌识别项目前试一试tesseract识别中文。tesseract的安装使用请参考: Python OCR工具pytesseract详解 - 知乎pytesseract是基于Python的OCR工具, 底层使用的是Google的Tesseract-OCR 引擎,支持识别图片中的文字,支持jpeg, png…

面试题之Vue和React的区别是什么?

一提到前端框架,相信大家都对Vue和React不陌生,这两个前端框架都是比较主流的,用户也都比较多,但是我们在使用这些框架的时候,是否对这两个框架之间的区别有所了解呢?接下来,让我们来一起的系统…

RK3399平台开发中安卓系统去除USB权限弹窗

RK3399平台开发中安卓系统去除USB权限弹窗 问题方法 问题 当我们在访问一个插入到Android系统的USB设备的时候往往是需要权限的,此时系统会弹出询问权限的对话框,而我们此时希望让它默认允许访问USB设备并且不希望用户看到这个对话框。 方法 文件目录&…

Git不常用命令(持续更新)

今日鸡汤:当你最满足的时候,通常也最孤独;当你最愤慨的时候,通常也最可怜。 此博文会列出一些平时不常用,但是能提高效率的git命令,后续会出IDEA对应的操作步骤 快看看你是不是都用过... 分支(…

蓝桥算法赛(铺地板)

问题描述 小蓝家要装修了,小蓝爸爸买来了很多块(你可以理解为数量无限) 23 规格的地砖,小蓝家的地板是 nm 规格的,小蓝想问你,能否用这些 23 的地砖铺满地板。 铺满地板:对于地板的每个区域&…

C语言-面试题实现有序序列合并

要求: a.输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 数据范围: 1≤n,m≤1000 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000 输入描述: 1.输入包含三行, 2.第一行包含两个正整数n, m&am…

Kubernetes 的有状态和无状态服务

Author:rab 目录 前言一、无状态服务案例1.1 yml 案例1.2 扩容与缩容1.2.1 扩容1.2.2 缩容 1.3 暂停与恢复1.3.1 暂停1.3.2 恢复 1.4 回滚 二、有状态服务案例2.1 yml 案例2.2 扩容与缩容2.2.1 扩容2.2.2 缩容 总结 前言 在 Kubernetes(k8s)…

(Java)中的数据类型和变量

文章目录 一、字面常量二、数据类型三、变量1.变量的概念2.语法的格式3.整型变量4.长整型变量5.短整型变量6.字节型变量 四、浮点型变量1.双精度浮点数2.单精度浮点数 五、字符型常量六、布尔型变量七、类型转换1.自动类型转换(隐式)2.强制类型转换(显式…

SCT52240STDR双路 4A/4A 高速MOSFET/IGBT栅极驱动器, 可并联输出

SCT52240是是一款宽供电电压、双通道、高速、低测栅极驱动器,包括功率MOSFET,IGBT。单个通道能够提供高达4A拉电流和4A灌电流的轨到轨驱动能力,并实现轨到轨输出。高达24V宽电压范围提高功率器件开关瞬间栅极驱动的振铃幅值裕度。13ns输入输出…

Pytorch公共数据集、tensorboard、DataLoader使用

本文将主要介绍torchvision.datasets的使用,并以CIFAR-10为例进行介绍,对可视化工具tensorboard进行介绍,包括安装,使用,可视化过程等,最后介绍DataLoader的使用。希望对你有帮助 Pytorch公共数据集 torc…

如何理解某一个开发框架的意图,从而去写和落代码文件位置不会出错

理解一个开发框架的意图并正确地组织代码和文件位置是一个重要的技能。这不仅需要对框架本身有深入的理解,还需要对框架背后的设计哲学和最佳实践有所了解。以下是一些帮助你达到这一目标的步骤和建议: 1. 学习框架的文档 详细阅读: 开始使用任何框架前…

【数据结构】数组和字符串(四):特殊矩阵的压缩存储:稀疏矩阵——三元组表

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表结构体初始化元素设置打印矩阵主函数输出结果代码整合 4.2.1 矩阵的数组表示 【数据结构】数组和字符串(一&#xff…

前端请求后台接口失败处理逻辑

前后分离项目,前端为uni-app(vue2),后台为java 后台api设置存在问题,部分公共接口为开放非登录用户访问权限 导致前台打开首页后立即跳转到登录提示页 怀疑是开了uni-app开发代理服务器,导致访问的代理服务…

Kubernetes 通过 Deployment 部署Jupyterlab

概要 在Kubernetes上部署jupyterlab服务,链接Kubernetes集群内的MySQL,实现简单的数据开发功能。 前置条件 镜像准备:自定义Docker镜像--Jupyterlab-CSDN博客 MySQL-Statefulset准备:StatefulSet 简单实践 Kubernetes-CSDN博客…