Timer 如何使用risc-v定时器精确生成定时

Timer 如何使用risc-v定时器精确生成定时,timer,riscv,Timer,Riscv,这个问题与risc-v的机器定时器有关。 我想用定时器来产生一个精确的频率中断。 我的计时器时钟以50MHz的频率运行,我希望每1ms有一次中断 因此,我设置mtimecmp=50000。根据risc-v规范,只要mtime>=mtimecmp就会出现中断 在我的中断处理程序中,我执行以下操作: mtime-=50000 这将为下一次中断的定时器提供精确的1kHz。我面临的问题是,执行上述语句确实需要超过0个时钟,这意味着mtime寄存器设置的值太低,导致平均中断频率略低于1kHz。 我想知道是

这个问题与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位写入操作写入中间值时不会产生错误的中断。)

您可以执行
mtimecmp+=50000相反?根据risc-v规范,如果mtime>=mtimecmp,则设置中断。由于环绕,递增mtimecmp不起作用。什么环绕?这些计数器是64位宽的,所以你有数千年的时间来计算环绕…啊。对很好。我没想到。有了这么大的柜台,它再也绕不过去了。非常感谢。如果你想写这篇文章作为解决方案,我很乐意接受。伟大的