【发布时间】:2020-09-07 08:25:23
【问题描述】:
我正在为 6502 CPU 制作一个模拟器,我想控制它的运行频率。
没有任何延迟,我的最大平均频率约为 70-80 MHz。但是,当我尝试使用 nanosleep 来控制频率时,它只能在我达到 1 mS 延迟(1000000 nS)之前工作。 如果我尝试将延迟设置得更低,例如 0.1 毫秒,它不会改变平均执行时间。对我来说奇怪的是,如果我将延迟设置为 0.1 毫秒,实际延迟结果为 ~.008 毫秒,并且对于 1-99999 纳秒范围内的任何值都不会改变。
我尝试在调试和发布模式下编译代码
我使用 nanosleep 是不是错了?这是我第一次使用 nanosleep,我之前只使用过 sleep 和 usleep,所以我有点困惑。 有没有更好的方法来控制代码执行的频率?
【问题讨论】:
-
请贴出包含函数调用和变量声明的代码。
-
改用计时器。睡眠不是定期运行代码的方式
-
如果您需要对时间进行非常精细的控制,您需要检查自上次滴答以来经过的实际时间,而不是仅仅假设 (nano)sleep 是完全准确的。一旦您的进程可能被取消计划的时间超过您的滴答持续时间(除非您还使用卡米尔回答中的实时调度程序类),您还需要处理追赶错过的滴答。
-
我认为一次计算1024步或类似的东西然后睡觉会更聪明,否则睡觉的开销比你的实际工作要贵得多。
-
您应该计算(虚拟)CPU 周期,并具有可变延迟(可能是循环或其他机制),使周期与经过的时间一致,以获得准确的频率。有一个计时器,定期检查虚拟 CPU 周期的数量,如果 CPU 运行太快,则增加延迟,太慢,则减少延迟。或者,计算一个确切的周期数,看看已经过去了多少实际时间。