Эмуляция ЦП и блокирующий к определенной тактовой частоте

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

27
задан Community 23 May 2017 в 10:33
поделиться

4 ответа

Смотрите на исходную quicktime документацию для вдохновения.

Это было записано давным-давно, когда отображение видео, предназначенного, просто подкачав все еще, структурирует в достаточно высоко скорости, но парни Apple решили, что им была нужна полная платформа тайм-менеджмента. Дизайн в первых взглядах сверхспроектировал, но он позволил им иметь дело с широко различными требованиями к скорости и сохранить их, плотно синхронизировался.

Вам повезло, что 6502 имеет детерминированное поведение времени, точное время каждая инструкция, взятия хорошо документируются; но это не постоянно. некоторые инструкции берут 2 цикла, другие 3. Точно так же, как кадры в QuickTime видео не имеет параметра 'кадров в секунду', каждый кадр говорит, сколько времени он хочет быть на экране.

Начиная с современного ЦП, таким образом недетерминированная, и многозадачная ОС может даже заморозиться для нескольких миллисекунд (виртуальная память!), необходимо сохранить вкладку, если Вы находитесь позади расписания, или если можно взять дремоту нескольких микросекунд.

9
ответ дан Javier 28 November 2019 в 05:38
поделиться

Я использовал бы такты для вычисления времени и их сон разница во времени. Конечно, чтобы сделать это, Вам нужны часы с высоким разрешением. Они способ, которым Вы делаете его, собираются пронзить ЦП во вращающихся циклах.

3
ответ дан Lou Franco 28 November 2019 в 05:38
поделиться

I wrote a Z80 emulator many years ago, and to do cycle accurate execution, I divided the clock rate into a number of small blocks and had the core execute that many clock cycles. In my case, I tied it to the frame rate of the game system I was emulating. Each opcode knew how many cycles it took to execute and the core would keep running opcodes until the specified number of cycles had been executed. I had an outer run loop that would run the cpu core, and run other parts of the emulated system and then sleep until the start time of the next iteration.

EDIT: Adding example of run loop.

int execute_run_loop( int cycles )
{
    int n = 0;
    while( n < cycles )
    {
        /* Returns number of cycles executed */
        n += execute_next_opcode();
    }

    return n;
}

Hope this helps.

14
ответ дан 28 November 2019 в 05:38
поделиться

Как говорит jfk, наиболее распространенный способ сделать это привязка скорости процессора к вертикальному обновлению (эмулированного) видеовыхода .

Выберите количество циклов для запуска на каждый видеокадр. Это часто зависит от машины, но вы можете рассчитать это примерно так:

cycles = clock speed in Hz / required frames-per-second

Затем вы также можете перейти в спящий режим до тех пор, пока не произойдет обновление видео, после чего вы начнете следующие n циклов эмуляции процессора.

Если вы эмулируете что-то конкретное, вам просто нужно посмотреть частоту кадров в секунду и скорость процессора, чтобы получить это примерно правильно.

РЕДАКТИРОВАТЬ: Если у вас нет требований к внешней синхронизации, то для эмулятора нормально просто беги так быстро, как только сможешь.

5
ответ дан 28 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: