RISC-V架构——CLINT中断控制器初始化(直接模式、向量模式)

news2024/9/22 22:31:11

1、前言

  • CLINT(Core-Local Interruptor)翻译过来是核本地中断控制器,是比较简单的中断控制器,通常和PLIC(Platform-Level Interrupt COntroller)搭配使用
  • 使用CLINT涉及的MTVEC、MCAUSE寄存器,CLIC控制器也同样会使用,两个寄存器会兼容CLINT和CLIC(Core-Local Interrupt Controller )
  • CLIC比CLINT的功能要强大一些,CLIC可以支持一定数目外部中断,而CLINT则不支持,需要结合PLIC来处理外部中断。简单理解:CLIC等于"CLINT+PLIC"的轻量版功能实现
  • RISC-V架构的特权集手册里只对MTVEC和MCAUSE寄存器做了最基础的规定,不同款的芯片,寄存器的未定义是有差别的,需要具体分析

2、mtvec寄存器介绍

2.1、mtvec寄存器的位介绍

在这里插入图片描述

  • 模式位占用两个bit,其中2和3这两个值是保留的,在有的芯片中,2和3会分别对应CLIC的直接模式和CLIC的向量模式
  • 模式位不仅可以决定是直接模式还是向量模式,还可以决定使用CLINT控制器还是CLIC控制

2.2、怎么设置直接模式、间接模式

csrs mtvec,1 /* 设置成CLINT的向量模式 */
  • 使用csrs指令去操作mtvec寄存器的低两位

2.3、异常处理入口函数地址的对齐要求

  • RISC-V特权集手册要求异常处理入口函数的地址必须是4字节向上对齐
  • 不同的芯片实现,在对齐要求上有差别,有的需要64字节对齐,有的需要256字节对齐
  • 为什么至少4字节对齐?
    • mtvec的低两位已经用来设置模式,但是地址是MXLEN位,如果是4字节向上对齐,则异常入口函数的地址的低两位肯定是0,这样就不用保存,所以BASE字段只有"MXLEN-2"位,要得到异常处理入口函数地址,只需要将mtvec.BASE << 2

2.4、怎么从mtvec寄存器识别出模式和异常入口函数地址

  • 识别模式:直接读取出mtvec寄存器的低两位的值
  • 读取出异常函数入口地址:从mtvec寄存器中读取出BASE字段,向左移两位;异常入口函数地址 = mtvec.BASE << 2,因为入口函数地址已经4字节向上对齐了,这里将低位填零的做法是没问题的

3、直接模式的初始化

在这里插入图片描述

4、向量模式的初始化

4.1、异常向量表的表项

在这里插入图片描述

  • 每个表项是4个字节,整个向量表的基地址存在mtvec.BASE字段中
  • 当发生中断时,硬件将自动跳转到mtvec.BASE + (4 * 中断号)地址处执行
  • 为什么32位和64位的异常向量表都是4字节?
    • 异常向量表的表项存的不是中断处理函数的地址,而是一条跳转到中断处理函数的指令,指令的长度就是4字节,和CPU架构的位数无关
    • 如果异常向量表的表项存的是中断处理函数的地址,才需要区分32位和64位架构的CPU
  • 零号中断和同步异常都跳转到mtvec.BASE + 0x00处,是否有歧义?
    • 在芯片实现时,会避免掉这种情况,要么干脆就没有零号中断
    • 在RISC-V的官方手册里有相关的说明,不是很理解文档里说的用户模式软件中断,下面是文档原文:
      在这里插入图片描述

4.2、代码初始化向量模式

在这里插入图片描述

  • 需要注意:每个中断号对应的处理函数必须用==attribute((interrupt))==属性修饰,目的是添加保存/恢复中断现场的代码
  • 每个表项都是跳转指令,跳转的范围是当前PC值的前后1MB范围
  • 可参考博客:gcc扩展选项__attribute__((interrupt))——指定中断处理函数属性-CSDN博客

5、直接模式和向量模式的比较

  • 直接模式
    • 优点:
      • 初始化简单,只有一个入口地址
      • 所有的中断和异常都共用保存/恢复中断现场的代码,编译出的bin文件会小一点(更少代码量)
    • 缺点:
      • 需要在异常处理函数中通过读取mcause寄存器的值来判断究竟是中断还是异常,判断逻辑要负责一点
      • 对于中断的响应会慢一点,因为需要软件去区分产生了哪一个中断
  • 向量模式
    • 优点:
      • 对于中断的响应速度回更快,由硬件去判断产生的中断号,并跳转到对应地址处执行(更快响应速度)
    • 缺点:
      • 初始化要更复杂,需要构建异常向量表,并且发生不同的中断,入口地址也不同
      • 每个中断处理函数都必须用__attribute__((interrupt)) 属性修饰,导致编译出来的汇编代码条数会比直接模式多

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

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

相关文章

python(23)——while循环

前言 在Python中&#xff0c;while 循环用于重复执行一段代码块&#xff0c;只要指定的条件保持为真&#xff08;True&#xff09;。一旦条件变为假&#xff08;False&#xff09;&#xff0c;循环就会终止。while 循环通常用于在不知道循环将执行多少次的情况下进行迭代。 w…

【快速搞定Webpack5】修改输出文件目录及自动清理上次打包文件(五)

介绍 默认情况下webpack打包后&#xff0c;我们的图片和js等文件都会被打包到dist目录下&#xff0c;文件多了混淆在一起一方面不利于文件的查找和管理&#xff0c;另外一方面看上去也不美观。 所以今天我们学习的内容就是控制输出后的文件进入不同的目录。 一、配置 新增4…

对象池模式-Object Pool Pattern

原文地址:https://jaune162.blog/design-pattern/object-pool-pattern/ 原文中可下载高清SVG矢量类图 引言 对象池模式(Object Pool Pattern)是一种创建一组可重用对象的设计模式。它通过维护一个预分配的对象集合,避免了频繁地创建和销毁对象所带来的性能开销。在需要使用…

力扣145 二叉树的后序遍历 Java版本

文章目录 题目描述递归解法代码 非递归解法思路代码 题目描述 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出…

指针笔试题(C语言进阶)

目录 前言 1、案例一 1.1 答案 1.2 解析 2、案例二 2.1 答案 2.2 解析 3、案例三 3.1 答案 3.2 解析 4、案例四 4.1 答案 4.2 解析 5、案例五 5.1 答案 5.2 解析 总结 前言 “纸上得来终觉浅&#xff0c;绝知此事要躬行”。本篇通过对指针实际案例的分析&…

【Spring】SpringBoot 创建和使用

目 录 一.什么是Spring Boot&#xff1f;为什么要学Spring Boot&#xff1f;二.Spring Boot 优点三.Spring Boot 项目创建3.1 使用 Idea 创建3.2 网页版创建注意事项&#xff1a;包路径错误小结&#xff1a;约定大于配置 一.什么是Spring Boot&#xff1f;为什么要学Spring Boo…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习二(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习二 01.括号生成02.组合03.目标和04.组合总和 01.括号生成 题目链接&#xff1a;https://leetcode.cn/problems/generate-parentheses/ 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有…

【JS逆向学习】同花顺(q.10jqka)补环境

逆向目标 目标网址&#xff1a;https://q.10jqka.com.cn/ 目标接口&#xff1a; https://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/3/ajax/1/ 目标参数&#xff1a;cookie 逆向过程 老规矩&#xff0c;先分析网络请求&#xff0c;发现是 cookie 加…

MySQL 8.0.36 WorkBench安装

一、下载安装包 百度网盘链接&#xff1a;点击此处下载安装文件 提取码&#xff1a;hhwz 二、安装&#xff0c;跟着图片来 选择Custom,然后点Next 顺着左边框每一项的加号打开到每一个项的最底层&#xff0c;点击选中最底层的项目&#xff0c;再点击传过去右边的绿色箭头&a…

光伏智慧化运维系统:实现一站式光伏服务前沿探索

随着全球能源结构的转型&#xff0c;光伏发电已成为绿色能源的重要组成部分。然而&#xff0c;光伏企业的运营和管理却面临着诸多挑战&#xff0c;如方案设计慢、运行状况难以实时掌握、收资效率低等。为解决这些问题&#xff0c;光伏智慧化运维系统应运而生&#xff0c;以其一…

2024牛客(4)K题

登录—专业IT笔试面试备考平台_牛客网 using i64 long long; using ll long long; constexpr ll M 1e9 7; template<class Info> struct SegmentTree {int n;std::vector<Info> info;SegmentTree() : n(0) {}SegmentTree(int n_, Info v_ Info()) {init(n_, …

学习笔记-Git

Git 问题一描述解决方法注意事项 问题一 描述 在commit和push的时候因为网络太慢了中途强行关闭了进程&#xff0c;而push的内容因为文件过大导致无法正常push 按照原本的流程在push的时候会提示失败&#xff0c;并且需要在解决了大文件之后重新push 而因为中途中断了&#x…

GitHubApp大集结!GSYGithubAppFlutter带你飞越编程世界!

GitHubApp大集结&#xff01;GSYGithubAppFlutter带你飞越编程世界&#xff01; GSYGithubAppFlutter是一个功能丰富、跨平台的开源GitHub客户端应用程序&#xff0c;基于Flutter框架开发。该项目属于GSYGithubApp系列&#xff0c;目前已经拥有Flutter、Weex、ReactNative和Ko…

Microsoft PowerToys:自定义 Windows 的实用程序

Microsoft PowerToys&#xff1a;自定义 Windows 的实用程序 Microsoft PowerToys 是一组实用程序&#xff0c;供高级用户调整和简化其 Windows 体验以提高工作效率。 微软官方地址为&#xff1a;https://learn.microsoft.com/en-us/windows/powertoys/&#xff0c;其github源…

防火墙内容安全笔记

目录 DFI和DPI IDS和IPS 签名 AV URL过滤 HTTPS过滤 内容过滤 文件类型过滤 文件内容过滤 邮件过滤 VPN概述 DFI和DPI DFI和DPI技术 --- 深度检测技术 DPI DPI --- 深度包检测技术 --- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#…

Spring的copy属性

Spring 的 BeanUtils.copyProperties()实现的是浅拷贝 ClassA public class ClassA {private Integer age;private String name;private ClassC c;public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public String getName() {return n…

【stm32】hal库-双通道ADC采集

【stm32】hal库-双通道ADC采集 CubeMX图形化配置 程序编写 /* USER CODE BEGIN PV */ #define BATCH_DATA_LEN 1 uint32_t dmaDataBuffer[BATCH_DATA_LEN]; /* USER CODE END PV *//* USER CODE BEGIN 2 */lcd_init();lcd_show_str(10, 10, 24, "Demo14_4:ADC1 ADC2 S…

vue大文件读取部分内容,避免重复加载大文件,造成流量浪费

使用场景&#xff1a;项目点云地图是pcd文件&#xff0c;但是文件可能上百兆&#xff0c;我需要获取到文件中的版本信息&#xff0c;跟本地的缓存文件做比较&#xff0c;如果不一致&#xff0c;才会加载整个文件。从而节省流量。 避免重复加载整个“.pcd文件&#xff0c;以最大…

2.21数据与结构算法学习日记(最小生成树prim算法)

目录 最小生成树prim 最小生成树算法是一种用来在一个加权连通图中找到最小生成树的算法。最小生成树是一个包含图中所有顶点的树&#xff0c;其总权值最小。 prim算法 洛谷题目示例 P3366 【模板】最小生成树 题目描述 输入格式 输出格式 输入输出样例 说明/提示 题…

郑板桥的人生境界是难得糊涂

郑板桥是康熙秀才&#xff0c;雍正举人&#xff0c;乾隆进士。 郑板桥小时候跟父亲在真州读书&#xff0c;长大后在真州教书。后来&#xff0c;郑板桥去扬州卖画谋生。 郑板桥没有老师&#xff0c;画画靠自己琢磨。郑板桥一生画竹&#xff0c;画了四十年的竹子&#xff0c;主…