일반적인 플랫폼에서 사용할 수있는 "주기적 이벤트"는 부정확하고 저주파수이며 확실히 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의 문자열 명령과 같은 것일지라도 실제로는 다시 분기되어 다시 실행 됨으로 루프됩니다).
정확하게 에뮬레이터에 대해 이야기하고 있습니까? qemu, FPGA 등? 내말은,이 에뮬레이터에 어떤 프로그래밍 환경을 사용할 것인가? –
일반적인 기술 (느린 타이머를 사용하여 초당 10 번 6k 사이클을 에뮬레이트 함)은 "평균적으로"작동하고 지터가 많으므로 여기서는 충분하지 않다고 가정합니다. – harold
@SamProtsenko 필자의 구체적인 사용 사례는 POSIX 운영 체제에서 실행되는 8 비트 CPU에 대한 에뮬레이터를 작성하는 것입니다. – fuz