2014-09-13 2 views
4

필자는 600 또는 1 킬로 헤르츠 (kilohertz)에서 실행되는 특정 속도가 느린 CPU 에뮬레이터를 작성하려고합니다. CPU 에뮬레이터를 아무 것도 쓰지 않고 한 번에 에뮬레이트하는 등의 순진한 방법으로 CPU 에뮬레이터를 작성하면 에뮬레이션이 600 킬로 헤르츠보다 훨씬 빠릅니다.에뮬레이션에 올바른 속도를 부여하는 방법은 무엇입니까?

호스트의 속도에 관계없이 올바른 속도로 에뮬레이터를 프로그래밍하여 CPU를 에뮬레이트하는 방법은 무엇입니까? 실제 에뮬레이터에서 일반적으로 어떤 기술을 사용합니까? 지터가 에뮬레이션을 느리게하는 것을 피하려면 어떻게합니까?

+0

정확하게 에뮬레이터에 대해 이야기하고 있습니까? qemu, FPGA 등? 내말은,이 에뮬레이터에 어떤 프로그래밍 환경을 사용할 것인가? –

+0

일반적인 기술 (느린 타이머를 사용하여 초당 10 번 6k 사이클을 에뮬레이트 함)은 "평균적으로"작동하고 지터가 많으므로 여기서는 충분하지 않다고 가정합니다. – harold

+0

@SamProtsenko 필자의 구체적인 사용 사례는 POSIX 운영 체제에서 실행되는 8 비트 CPU에 대한 에뮬레이터를 작성하는 것입니다. – fuz

답변

3

일반적인 플랫폼에서 사용할 수있는 "주기적 이벤트"는 부정확하고 저주파수이며 확실히 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의 문자열 명령과 같은 것일지라도 실제로는 다시 분기되어 다시 실행 됨으로 루프됩니다).

+0

그건 현명한 소리. 일부 시스템에서는 정확한 시간 인터럽트를 사용하여 사운드를 재생합니다. 나는 이것이 당신이 묘사하는 에뮬레이션 접근법으로 재현 될 수 없다는 것을 이해합니다. 필자의 경우에는 다른 방식으로 소리가 나는 부분을 에뮬레이션 할 수 있지만 정확한 타이밍에 따라 그런 것들을 얻으려면 어떤 트릭이 있습니까? – fuz

+0

@FUZxxl 그것은 더 까다 롭습니다. 한 가지 접근법 : 사이클 카운터를 기반으로하는 정확한 시간과 함께 레이블 "외부 이벤트"를 본 다음 그 시간에 발생한 것처럼 처리됩니다. 그러나 모든 것이 반드시 작동하는 것은 아닙니다. – harold

+0

@harold 선매는 어떻게됩니까? 귀하의 방법은 그것을 계좌로 가져 가야합니까? 우리가 [time slice] (http://en.wikipedia.org/wiki/Preemption_%28computing%29#Time_slice) 스케줄러의 값을 알고 있다면 (우리는'sched_rr_get_interval()'으로 얻을 수 있음) - 우리는 에뮬레이트 된 CPU의 한주기가 스케줄러에 의해 중단되지 않도록 계산에서이 값을 사용해야합니까? –

관련 문제