2016-11-11 6 views
3

Я пытаюсь реализовать основной цикл эмулятора. Эмулятор работает на полной скорости. Около 60 МГц. Но я хочу, чтобы он работал на 4.77 МГц. Как это сделано ?Скорость медленного спуска эмулятора

for (;;) 
{ 
     emu_step(ctx) ; 
     uint64_t current = get_gtod_clock_time() ; 
     uint64_t elapsed = current - last_time ; 
     if (elapsed >= 1000000) 
     { 
      printf("Cycles: %d\n", get_cycles(ctx)) ; 
      set_cycles_zero(ctx, 0) ; 
      last_time = get_gtod_clock_time() ; 
     } 
} 

emu_step() - это функция, которая выполняет одну инструкцию. get_cycles(ctx) - сумма выполненных машинных циклов. set_cycles_zero(ctx, 0) устанавливает циклы, равные нулю.

ответ

0

Я думаю, что это потому, что emu_step выполняется на каждой итерации цикла for, если вы переместили его внутри if, тогда он будет выполнен только тогда, когда elapsed >= 1000000. В этом конкретном случае вы можете выполнить его один раз, независимо от цикла, так что вам не нужно ждать одного дросселя cycle.

Это может выглядеть как

emu_step(ctx) ; 

for (;;) 
{ 
     uint64_t current = get_gtod_clock_time() ; 
     uint64_t elapsed = current - last_time ; 
     if (elapsed >= 1000000) 
     { 
      emu_step(ctx); 
      printf("Cycles: %d\n", get_cycles(ctx)) ; 
      set_cycles_zero(ctx, 0) ; 
      last_time = get_gtod_clock_time() ; 
     } 
} 
Смежные вопросы