На типичной платформе единственные доступные «периодические события» являются неточными и низкочастотными, уж точно не 0,6 МГц. Но используя «медленный» таймер (возможно, 100 Гц или около того), вы можете «запустить много коротких спринтов», с достаточным временем «отдыха» между ними, что в среднем вы эмулируете нужное количество циклов в секунду. Время обычно можно измерить довольно точно, поэтому вы можете эмулировать точное количество циклов в каждом «спринте».
На высоком уровне это может выглядеть примерно так:
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, они фактически зацикливаются, разветвляясь и повторно выполняя себя).
person
harold
schedule
11.04.2015