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

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、代码初始化向量模式

在这里插入图片描述

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

  • 直接模式
    • 优点:
      • 初始化简单,只有一个入口地址
      • 所有的中断和异常都共用保存/恢复中断现场的代码,编译出的bin文件会小一点(更少代码量)
    • 缺点:
      • 需要在异常处理函数中通过读取mcause寄存器的值来判断究竟是中断还是异常,判断逻辑要负责一点
      • 对于中断的响应会慢一点,因为需要软件去区分产生了哪一个中断
  • 向量模式
    • 优点:
      • 对于中断的响应速度回更快,由硬件去判断产生的中断号,并跳转到对应地址处执行(更快响应速度)
    • 缺点:
      • 初始化要更复杂,需要构建异常向量表,并且发生不同的中断,入口地址也不同
      • 每个中断处理函数都必须用__attribute__((interrupt)) 属性修饰,导致编译出来的汇编代码条数会比直接模式多
  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ALU(算术逻辑单元)是计算机处理器中负责执行算术和逻辑操作的核心组件。在设计RISC-V处理器的过程中,ALU的优化是至关重要的一步。 首先,我们可以通过增加多个ALU管道来提高处理器的性能。这样,指令可以在多个ALU之间并行执行,从而加快处理速度。另外,还可以采用超标量技术,将多个ALU分组,并行执行不同的指令,进一步提高处理器效率。 其次,为了提高ALU的性能,我们可以通过增加更多的功能单元来支持多种操作。例如,我们可以添加浮点运算单元,以支持浮点运算指令。此外,还可以添加位移单元和乘法单元等,以执行各种操作。通过提供更多的功能单元,ALU可以在单个周期内执行更多的操作,提高处理器的性能。 另外,在ALU的设计中,还需要考虑到电路延迟的问题。通过优化电路布线和信号传输路径,可以减少ALU操作所需的时间。此外,采用流水线技术也可以提高处理器的吞吐量。通过将ALU操作划分为多个阶段,并行执行多条指令,可以大大提高处理器的效率。 最后,为了优化ALU的设计,还需要考虑功耗的问题。通过采用低功耗电路设计和节能技术,可以有效降低ALU的功耗。此外,在处理器的设计过程中,还可以采用动态电压调整和时钟频率调整等技术,根据实际负载情况动态调整ALU的电压和频率,以达到节能的目的。 综上所述,通过增加ALU管道、添加更多功能单元、优化电路延迟、采用流水线技术和优化功耗等方法,可以对RISC-V处理器中的ALU进行优化,提高处理器的性能和效率。这些优化措施能够使处理器更快、更强大,更适应各种复杂的计算任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值