位mip.MEIP 和mie.MEIE 是 M-mode 外部中断的中断挂起和中断允许位。 MEIP 在mip中是只读的,由*台特定的中断控制器设置和清除。 位mip.MTIP 和mie.MTIE 是 M-mode 定时器中断的中断挂起和中断允许位。 MTIP 在mip中是只读的,通过写入映射到内存的mtimecmp来清除。 位mip.MSIP 和mie.MSIE 是机器级软件...
当内存映射寄存器mtime大于或等于全局时间基准寄存器mtimecmp时,触发定时器中断(中断ID#7),这两个寄存器都是CLINT内存映射的一部分。其他harts可以写入mtimecmp来设置定时器中断。通常情况下,mtime和mtimecmp寄存器仅在机器模式下可用,除非PMP授予用户或特权模式对它们所在的内存映射区域的访问权限。 Global interrupts are ...
软件中断(中断 ID #3):通过写入特定 hart 的内存映射中断挂起寄存器 msip 来触发。 定时器中断:当寄存器 mtime 大于或等于寄存器 mtimecmp 并且两个寄存器都是 CLINT 内存映射的一部分时,会触发定时器中断(中断 ID #7)。mtime 和 mtimecmp 寄存器通常仅在机器模式下可用,除非 PMP 授予用户或管理员模式访问它们...
图中的msip用于产生m模式下的核间中断,mtime可以读取出当前计数器的值,mtimecmp用于设置比较值,当mtime的值增加到mtimecmp的值时就可以产生中断。这些寄存器的具体用法在后续的裸机程序编写章节会讲解,这里只需要简单了解即可。 上述讲解的三种中断类型在m模式和s模式下都有相应的中断使能位设置,这是通过mie寄存器实现...
要想产生计时器中断,需要core朝mtimecmp里写入一个阈值,mtime寄存器每当clk rtc翻转一次时计数值加1,当mtime大于mtimecmp时,产生计时器中断,报告给core。 要想产生软件中断,需要core朝msip寄存器写1,当msip寄存器值为1时产生软件中断,报告给core。 在多核系统中,每个core都包含一个clint,都有自己独有的计时器中断...
CLINT控制这两种中断的方式是通过内存映射,所以不同的实现内存映射的方式会有不同。在SiFive E1的实现中,它的内存映射如下所示: SiFive E1内存映射 顺便一提,从中断的来源分类,中断共有三种类型:软件中断、定时器中断和外设中断,其中外设中断有PLIC管理。 本文中主要讨论定时器中断(mtime),所以不考虑软件中断。
定时器中断的触发是由硬件来检查和处理的。在RISC-V架构中,CLINT(Core Local Interruptor)负责管理定时器中断。具体来说,硬件会不断比较 mtime 寄存器和每个硬件线程的 mtimecmp 寄存器的值,当 mtime 的值达到或超过 mtimecmp 的值时,硬件会触发一个定时器中断。
CLINT的全称(Core-Local Interruptor)核间局部中断。 主要是定义了M-Mode(机器模式)的软件中断和计时器比较中断,S-Mode(超级用户模式)下的软件中断和计时器比较中断。 基本上和官方定义的一样,但是玄铁c906并未实现mtime寄存器,这一点是需要注意的。mtimer寄存器的作用是读取当前的cycle。
PVS332 SoC支持RISCV架构定义的系统的定时器(MTIME、MTIMECMP)这两个寄存器在0x0ffc0000-0x0ffc000f的空间里。该定时器在MTIME计时到MTIMECMP之后会产生定时器中断,只有当程序更新了MTIME或者MTIMECMP寄存器之后中断才会被清除。 (2)软件中断控制器 软件中断控制器可以让程序使用置1的方式产生同步的软件中断。