Microcontroller Emulator
-
Nabend,
ich bin nun dabei, einen Emulator für einen Microcontroller zu programmieren. Eine vollständige Dokumentation usw. habe ich schon gefunden. Ich bin nun am überlegen, wie ich die ganzen Assembler-Befehle emulieren könnte. Das einzigste was mir im Kopf rum schwebt ist, bspw. für jeden Befehl eine Klasse zu erstellen und jede Variante davon (bspw. von mov gibt es ja einige) per Hand die Funktionsweise des Befehls nachbilden. Natürlich werden die Befehle nicht auf der eigenen Maschine ausgeführt sondern in einer Art Umgebung bzw. VM dafür. Jedoch wäre das der totale Klassenüberlauf und Schreibaufwand für jeden Befehl was eigenes zu erstellen. Kennt sich jemand damit aus und kann einen leichteren Weg vorschlagen?
Wäre sehr dankbar für hilfreiche Beiträge.
Den selben Thread habe ich letztens bei gulli.de erstellt, jedoch kamen da eher weniger hilfreiche Beiträge dabei raus. Wer möchte, kann sich natürlich die Antworten dort mal zu Gemüte führen: http://board.gulli.com/thread/1607312-c-microcontroller-emulator/
Am Besten ich sage gleich dazu, dass die Klassen, welche einen Befehl darstellen, die beiden Methoden emulate und assemble überschreiben müssen, und somit jeweils von meiner Assembler- und Emulator-Klasse einfach aufgerufen werden können. Im Zusammenhang mit dem Factory-Pattern sollte dies relativ dynamisch und überschaubar sein. Jedoch hab ich nach wie vor das Gefühl, dass diese Lösung nicht unbedingt das gelbe vom Ei ist. Jedoch kann ich mich mit der bei gulli vorgeschlagenen Lösung (eine Methode pro Assembler-Befehl) auch nicht anfreunden, da dies das selbe wie mein Vorschlag ist, nur dass ich die Flexibilität verliere und eine Datei mix ewig vielen Zeilen anstatt ewig vielen Klassen hab.
Somit frage ich hier nochmal. Gibt es jemanden der einen weiteren Vorschlag für eien Lösung hätte? Wenn nicht würde ich trotzdem gerne Meinungen über meinen Lösungsvorschlag anhören (um nicht ganz so verunsichert zu sein ... oder eben doch).
Viele Grüße
-
Ich verstehe nicht deinen Ansatz für jeden Befehl eine Klasse zu erstellen. Die Befehle dürften doch zustandslos sein (außer du hast einen wirklich exotischen Controller vorliegen). Das heißt die Befehle wären eher so etwas wie Methoden einer Klasse
Microcontroller.P.S.: Ich sehe gerade, dass du effektiv die gleiche Antwort bei Gulli bekommen hast. Jedoch gehst du dort nie richtig auf die Gegenfrage ein, warum du überhaupt Klassen für die Befehle schreiben willst. Deine Argumentation der größeren Flexibilität konnte ich nichtnachvollziehen.
-
Da ich nicht weiss, um welchen uC es konkret geht folgende Idee:
Ein Opcode besteht aus dem Befehl 0..n Operanden und der Addressierungsart (da nehme ich jetzt mal nur beispielhaft Namen an). Also z.B.
move #1, A7besteht ausmovedem Opcode#1dem ersten Operanden, Addressierung "Immediate"A7dem zweiten Operanden, Addressierung "Register direkt"
Wie SeppJ schon schreibt, macht es da nicht so viel Sinn für jede Möglichkeit eine Klasse zu erstellen. Ich glaube, Du kommst einem passenden Design eher näher, wenn Du erst mal die zu emulierende Maschine in ein Klassenmodell abbildest, also ALU, Register, Peripherie, Microcodespeicher, usw.
Die Ausführung eines Befehls erzeugt ja einen bestimmten Ablauf in der Hardware. Den willst Du ja nachbilden. Also z.B. move besteht vielleicht aus mehreren Mikrocode-Operationen: Setzen der Bits im ALU register, Laden des Zielregisters, usw.
Als ersten Wurf würde ich daher die möglichen OpCodes als einzelne Methoden realisieren, denen die Operanden übergeben werden. Für den Operanden lohnt sich vielleicht eine kleine Klasse, die Wert und Adressierungsmodus kapselt.
Das soll's erst mal sein mit Denkanstößen
Lass Dich nicht entmutigen, ich finde das ist ein schönes Projekt!
-
skNiNe schrieb:
...
Deinen Ansatz kann ich nachvollziehen.
Vorteile:
- Das Netzwerk der Klassen-Objekte im RAM ist nachher ein Zwischencode, der schneller ausgeführt werden kann, als wenn man jeden Befehl einzeln dekodieren müßte.
- Du kannst ganz natürlich "die beiden Methoden emulate und assemble überschreiben".
Ich würde ihn nicht gleich verwerfen, nur weil Du hier auf wenig Gegenliebe stößt.
Es wäre wichtig, zu wissen, wie genau emuliert werden soll. Kommt es nur darauf an, daß alle Ausgänge in der richtigen Reihenfolge schalten? Oder soll auch die Zeit genau stimmen? Oder soll darüberhinaus der innere Zustand beobachtbar sein?
Je genauer es werden muß, desto stärker läuft das Projekt in Richtung MMIX-Ware, und entfernt sich auch von Deinem Ansatz. Wobei im Gegensatz zu MMIX-Ware es wohl trotzdem praktisch ist, wenn Du "emulierende Maschine in ein Klassenmodell abbildest, also ALU, Register, Peripherie, Microcodespeicher, usw" packst.
(Knuth hat's nicht so mit OO.)
-
Nabend,
es geht hierbei um einen 8051 Microcontroller. Das Hauptziel ist, dass man die interne Struktur, also den Zustand bzw. die Werte der Register und Adressen usw. während des Emulationsvorgangs möglichst genau beobachten kann. Im Allgemeinen handelt es sich um einen Emulator, der von Schülern einer Berufsschule benutzt werden soll, um den Umgang mit Assembler zu lernen.
Viele Grüße
-
mich wundert nur was das den Schülern der Berufsschule bringen soll ... der Markt für direkte Assemblerproggen ist überschaubar (Behauptung) und für das Verständnis von atomarer Realisierung von Hochsprachen finde ich das nun etwas übertrieben ...
-
Sind technische assistenten für informatik (http://de.wikipedia.org/wiki/Technischer_Assistent_f%C3%BCr_Informatik). Da die eher die technischeren Informatiker sind, spielt Microcontroller- und somit Assembler-Programmierung eine große Rolle.
-
Da dieser Thread wohl in Vergessenheit geraten ist, wollte ich hier nochmal was schreiben, um darauf aufmerksam zu machen, dass dieser noch nicht abgeschlossen ist (soweit evtl. jemanden noch etwas einfallen würde).
Viele Grüße
-
Ich bin verwirrt .. sowas gibts doch schon? zB http://www.edsim51.com/ http://www.8051projects.net/downloads77.html http://bit.kuas.edu.tw/~8051/ http://www.keil.com/c51/
Ich habe leider kaum Ahnung von Microcontrollern und nur wenig von Assembler (mal auf 8086 Computern vor >10 Jahren) aber ich würde wohl versuchen ein Modell des 8051 per Klassen zu bauen. Dann eine Gui drumrum, einen Text-Eingabefeld/Laden/Speichern für "Programme", das ganze parsen und auf die 8051 Modellierung loslassen ... den Befehlssatz wohl als Methoden auf der Modellierung. Das ganze mit ner manuellen Taktung und nem Animationsmodus der alle n Sekunden einen Takt weitergeht. Am besten gleich mit einer Art UNDO so dass man auch zurückgehen kann. Dazu noch ne Textausgabe ... wo liegt nun das konkrete Problem?