作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为运行速度在 600 千赫兹左右的特别慢的 CPU 编写一个模拟器。如果我以简单的方式为 CPU 编写一个模拟器(即一次模拟一条指令而不做任何其他事情),那么模拟速度将比 600 kHz 快得多。
如何对模拟器进行编程,使其以正确的速度模拟 CPU,而不管主机的速度如何?现实世界的模拟器通常使用什么技术来做到这一点?如何避免抖动减慢仿真速度?
最佳答案
在典型的平台上,唯一可用的“周期性事件”是不准确的和低频的,当然不像 0.6MHz。但是使用“慢速”计时器(可能是 100Hz 左右),您可以“运行许多短冲刺”,在中间有足够的时间“休息”,平均而言,您可以模拟每秒正确的周期数。时间通常可以相当准确地测量,因此您可以在每个“冲刺”中精确模拟正确的周期数。
在较高的层面上,这可能看起来像这样:
int cycle_budget = 0;
time last_sprint = something;
// on timer fire
cycle_budget += (current_time - last_sprint) * clock_rate;
last_sprint = current_time;
while (cycle_budget >= slowest_instruction)
tick(); // emulates one instruction, subtracts from cycle_budget
有一些明显的变化,例如,您可以让预算为负值,而不是测试是否有足够的资金来运行慢速指令。或者您可以解码指令,然后测试是否有足够的预算来运行它。这一切都假设一条指令不会花费任意长的时间,但据我所知,这从来都不是问题(即使是像 z80 的字符串指令,它们实际上是通过分支返回并重新执行自身来循环的)。
关于emulation - 如何为仿真提供正确的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828370/
我是一名优秀的程序员,十分优秀!