如何使用 RISC-V 定时器进行精确的时序生成

How to use risc-v timer for accurate timing generation

这个问题是关于risc-v的机器定时器的。 我想使用定时器来产生准确的频率中断。 我的计时器时钟以 50MHz 运行,我想每 1ms 中断一次。

因此我设置了mtimecmp = 50000;。根据 RISC-V 规范,一旦 mtime >= mtimecmp 就会出现中断。

在我的中断处理程序中,我这样做: mtime -= 50000;

这应该为下一个精确 1kHz 的中断准备定时器。我面临的问题是上面语句的执行确实需要超过 0 个时钟,这意味着 mtime 寄存器设置的值有点太低,导致平均中断频率略低于 1kHz。 我想知道是否有解决方案。是否有可能使用股票 risc-v mtimer 获得准确的中断频率?怎么样?

我建议改用 mtimecmp += 50000;,不要管 mtime。 (我相信你可以触摸 mtimecmp 来重置 MTIP,所以不需要触摸 mtime。)

即使在 32 位机器上,这些计数器也是 64 位宽,因此回绕需要数千年。

(特权规范还提供了在 32 位机器上更新 mtimecmp 的序列,这样使用多个 32 位写入时写入的中间值不会产生错误中断。)