如何使用 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 位写入时写入的中间值不会产生错误中断。)
这个问题是关于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 位写入时写入的中间值不会产生错误中断。)