这次我们介绍的功能是CLINT中断。
首先我们先看一下指令集《The RISC-V Instruction Set Manual Volume II: Privileged Architecture Privileged Architecture Version 1.10》是如何定义的。
文档链接:
https://riscv.org/specifications/privileged-isa/

再看看E3关于CLINT的说明。

红色箭头是一个软件中断位,配置为1会产生中断,配置为0清除中断。
蓝色箭头是timer比较数值的配置,当mtime的数值等于mtimecmp时,会产生timer中断,当然前提是打开了这个中断的开关。
绿色箭头是mtime的值,根据时钟每次+1。
需要注意的是mtime和mtimecmp都是64-bit的寄存器,所以32-bit总线系统需要操作两次。还有rocket-chip这边是没有单独引出rtc_toggle这个时钟输入端口的,它是直接采用core的时钟进行100分频,如果想像E3那样采用外部异步时钟的话,需要修改scala代码。而且需要保证rtc_toggle与core_clk有一定的倍数关系,例如:rtc_toggle≤core_clk/2。
还需要注意的是,mtime在复位后是会被清0的,但mtimecmp不会。
接下来直接看测试代码。
#include "encoding.h"

本文深入解析RISC-V架构中的CLINT中断机制,包括软件中断与定时器中断的配置与触发流程,通过具体代码示例展示如何实现中断处理,并讨论了mtime与mtimecmp寄存器在32-bit系统中的操作细节。
2487

被折叠的 条评论
为什么被折叠?



