CPU-Emuator/Programm ausführ Geschwindichkeit regeln
-
Wer nicht soviel lesen möcht siehe "Kurzfassung"
I. Das Problem:
Ich möchte ein Prozess/Thread/Programm mit einer ganz bestimmten Frequenz betreiben, aber die Prozzessorfrequenz selbst soll nicht verändert werden z.B.: mit 8MHz. Das kann man auch, wenn man will mit einem asm-Debugger vergleichen, der überall Breakpoints hat und nach einer bestimmten Zeit automatisch weiter stept.also ein Beispiel:
while eine Sekunde nicht vergangen { hz++; }
hz sollte dann im Optimalfall den Wert 8*106 (8000000Hz = 8MHz) haben.
Aber nimmt das nicht so genau mit dem Beispiel. Einfach die vom Compiler wegen dem while generierten Assembler-Sprungbefehle und Vergleichbefehle ignorieren.
II. Die Theorie:
1. Wie viel Zeit muss ein asm-Befehl verbrauchen, um auf z.B.: 8MHz zu kommen?1 Hz = 1/s => 8MHz pro Sekunde 8*10[h]6[/h]Hz = 1*10[h]9[/h] //(1s) Sekunde in Nanosekunde. 1Hz = 1*10[h]9[/h]/(8*10[h]6[/h]Hz) = 125ns
Das Programm hat 125ns Zeit um ein Befehl zu Verarbeiten.
2. Der Instruction Pointer
Ein Befehl wurde ausgefürt nachdem der Instruction Pointer (Befehlszähler) sich erhöht hat.3. Welche maximale Emulationsgeschwindichkeit lässt das System grob zu? - abhängig von der Hardware und vom Betriebssystem.
Einfach das Beispiel aus I. ausführen und schon ergibt sich z.B. auf meinem System ca. 120MHzIII. Die Lösungsansätze
1.thread gestopt erstellen while(true) { int hz = 0; do { hz++; thread fortsetzen und wieder anhalten, nachdem der IP (Instruktions Pointer) sich erhöt hat nur wie stellt man fest, dass der IP sich verändert hat? speedcontrol();// rest der verblibnden Zeit warten }while( /* ! eine sekunde vergangen */ );// schleife eine sekunde lang wiederholen printf("Hz: %d \t MHz: %d\n",hz,hz/1000000); }
Wie kann der Thread so exakt kontrolliert werden, sodas nur ein Assemblerbefehl ausgefürt wird?
und wie kann die Zeit so genau gemessen werden?
Es muss natürlich nicht zwingend ein Thread sein.Eine andere Möglichkeit wäre eine CPU-Emulation, nur ist das nicht zu aufwendig? Ich denke, das lässt sich sicher anders lösen.
Über andere Lösungsansätze würde ich mich auch freuen.
Kurzfassung:
Ein Programm soll so genau kontrolliert werden, sodas das Programm nur mit einer bestimmten MHz Frequenz abläuft. CPU-Frequenz soll unverändert bleiben.
Probleme:
1. Genau Zeitmessung
2. Programm kontrolle(Instruktions Pointer)mfg
-
Mir fehlt da eine Antwort auf eine simple Frage: Was willst du damit erreichen?
http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.htmlFrage nach dem, was du erreichen willst und nicht danach womit du es erreichen willst. Es kommt des Öfteren vor, dass Leute zielgerichtet Fragen stellen, wie sie z.B. eine bestimmte Funktion auf eine bestimmte, ungewöhnliche Art und Weise nutzen können. Im Laufe längerer Diskussionen kommt dann heraus, dass sie ein konkretes Problem lösen wollen und der Meinung sind, diese Funktion sei das richtige Werkzeug. Oft kommt dann ein Vorschlag, wie man das Problem anders (meist eleganter und nicht mit so ungewöhnlichen Mitteln) lösen kann. In so einem Fall kann einem viel schneller geholfen werden, wenn man das zu lösende Problem gleich zu Anfang mit schildert, denn die Frage "Was willst du damit eigentlich erreichen?", oft gepaart mit der Feststellung "Sieht nach Designfehler aus..." kommt bestimmt! Trotzdem den eigenen Lösungsansatz nicht vergessen, denn das zeigt dass du dich mit dem Problem beschäftigt hast und nicht auf Musterlösungen aus bist.
Grüssli
-
ich will ein Programm mit z.B. 8MHz betreiben. Das ist das einzige was ich erreichen will.
Der Sinn der Sache ist eine Simulation eines Programms der auf einem leistundsschwachen cpu ausgeführt wird.
Danke für den Hinweis
-
Also willst du sowas machen wie die DosBox? Wäre zumindest mal eine Anlaufstelle, um zu schauen, wie die es machen.
Wie sieht es mit der Platform aus? Denn mit Standard C++ dürfte das eher schwer zu bewerkstelligen sein. Du wärst also vielleicht besser in einem anderen Forum aufgehoben.
Grüssli
-
DosBox emuliert den CPU... der cpu ordner ist ~1MB groß
OS: WIN32 reboot ist aber auch kein Problem. Linux.
-
Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du mußt wissen wieviele Taktzyklen (sagen wir N) jeder Befehl der simulierten CPU verbraucht. Dann müßtest Du pro Befehl N*feste_zeit warten um die CPU taktgetreu zu simulieren. So einfach gehts aber nur, wenn Die CPU kein Pipelining hat.
-
du kannst die cpu entweder schneller laufen lassen, wenn das probleme macht musst du eben den thread schlafen schicken indem du für jede instruktion in einer tabelle die taktzyklen speicherst und nachjedem befehl diese aufaddierst. so macht man es wenn man einen emulator programmiert.
-
Hoi,.. also n emu zu schreiben wär wohl das beste,...
dazu müsstest du halt ein parser für ein (jetzt mal beliebiges) script basteln,am besten wäre wohl als erstes asm mnemnonics,.. die sind am einfachsten zu bewerkstelligen und zu kontrollieren, dann definierst du noch wie "lange" ein spezifischer register zugriff, call, ret, jmp, breq braucht und pausierst dann in der zwischenzeit,... am besten du schaust dir mal ne 8085 cpu an und versucht schrittweise dies zu emulieren,...
ich habe mal so was aber für nen avr gemacht, welcher sich quasi durch seine eigene binary frisst,... aber naja,.. ein bissl spucke gehört schon dazu,...
seid gegrüßt
-
nein lass es. CPU core simulator zu debuggen is das härteste wo gibt. das hat mir einiges abverlangt damals meinen z80 core zu entbugg0rn, dann bin ich fast ausgerastet
-
Ich hab mich eigentlich schon entschloßen es mit Breakpoints zu lösen, also so wie ein debugger. Ich sucher aber immer noch nach einem guten Ansatz wie man mit Breakpoints arbeitet.