-
Die Erfindung betrifft eine Verarbeitungseinrichtung
zum Ausführen
virtueller Maschinenbefehle; wobei die Verarbeitungseinrichtung
umfasst: einen Befehlsspeicher zum Speichern von Befehlen einschließlich zumindest
einem der virtuellen Maschinenbefehle; einen Mikrocontroller mit
einem Prozessor, der einen zuvor bestimmten Mikrocontrollerkern
zum Ausführen
nativer Befehle aus einem zuvor bestimmten Satz von mikrocontrollerspezifischen
Befehlen umfasst; wobei die nativen Befehle sich von den virtuellen
Maschinenbefehlen unterscheiden; und einen Vorprozessor mit: einem
Umsetzer zum Umsetzen zumindest eines virtuellen Maschinenbefehls,
der aus dem Befehlsspeicher abgerufen worden ist, in zumindest einen
nativen Befehl; und einem Zuführmittel,
um native Befehle dem Mikrocontrollerkern zur Ausführung zuzuführen.
-
Die Erfindung betrifft weiter einen
Vorprozessor zur Verwendung mit einem Mikrocontroller mit einem Prozessor,
der einen zuvor bestimmten Mikrocontrollerkern zum Ausführen nativer
Befehle aus einem zuvor bestimmten Satz von mikrocontrollerspezifischen
Befehlen umfasst;
welcher Vorprozessor umfasst: einen Umsetzer
zum Umsetzen zumindest einen virtuellen Maschinenbefehls, der aus
einem Befehlsspeicher abgerufen worden ist, in zumindest einen nativen
Befehl; wobei die nativen Befehle sich von den virtuellen Maschinenbefehlen
unterscheiden; und einem Zuführmittel,
um native Befehle dem Mikrocontrollerkern zur Ausführung zuzuführen.
-
Zunehmend werden Quellenprogramme
in Befehlen einer virtuellen Maschine ausgedrückt (in sie kompiliert) statt
in nativen Befehlen eines Mikrocontrollers, auf dem das Programm
auszuführen
ist. Ein Hauptgrund für
die Verwendung einer virtuellen Maschine ist die Portabilität von Programmen
zwischen unterschiedlichen Maschinen (Plattformen). Ein in virtuellen
Maschinenbefehlen der virtuellen Maschine ausgedrücktes Programm
kann relativ einfach auf mehreren konkreten Maschinen ausgeführt werden,
bei Verwendung geeigneter Interpreter, die auf diesen Maschinen
arbeiten. Derzeit ist eine treibende Kraft, portable Programme zu
verwenden, Java, wobei Java-Programme (als Applets bezeichnet) über Internet
ausgetauscht werden und auf unterschiedlichen nativen Maschinen
unter Verwendung von Prozessoren mit unterschiedlichen Befehlssätzen ausgeführt werden
können.
Mit Hilfe eines Compilers werden Java-Applets in Java-Bytecodes
(JBCs) ausgedrückt,
die die Befehle der Java Virtual Machine (JVM) bilden. Für eingebettete
Anwendungen ist eine weitere treibende Kraft, virtuelle Maschinen
zu verwenden, der Bedarf an kompaktem Code. Da der Umfang von Software
kontinuierlich zunimmt, werden Softwarekompressionstechniken, die
wegen gewisser Anfangskosten bisher nicht interessant waren, jetzt
möglich.
Eine solcher Techniken ist, eine geeignete virtuelle Maschine für eine spezielle
eingebettete Anwendung zu wählen,
sodass das Programm in den virtuellen Maschinenbefehlen kompakter
ausgedrückt
werden kann als in den nativen Befehlen. Ein Beispiel für eine solche
virtuelle Maschine ist eine Stapelmaschine, die für ihre kompakte
Darstellung bekannt ist. Eine spezielle virtuelle Maschine für eine eingebettete
Anwendung kann definiert werden, indem zuerst das Quellenprogramm
in virtuellen Maschinenbefehlen einer gewählten virtuellen Maschine,
wie z. B. a Stapelmaschine, ausgedrückt wird und indem zusätzlich Sequenzen
aus virtuellen Maschinenbefehlen, die häufig in dem kompilierten Code
auftreten, durch neu definierte zusätzliche virtuelle Maschinenbefehle
ersetzt werden, wobei z. B. ein einziger neuer Befehl eine Sequenz
aus vier vorhandenen Befehlen ersetzt.
-
Herkömmlicherweise werden Programme,
die in virtuellen Maschinenbefehlen ausgedrückt sind, mit Hilfe von Softwareinterpretation
ausgeführt.
Der Prozessor (CPU) führt
ein spezielles Interpreter-Programm aus, wobei der Prozessor in
einer Schleife einen virtuellen Maschinenbefehl abruft, ihn in eine
Sequenz aus nativen Befehle des Mikrocontrollerkerns des Prozessors
decodiert und jeden nativen Befehl ausführt. Diese Technik ist langsam
und erfordert ein zusätzliches
Interpreter-Programm, das relativ groß sein kann. Zur Erhöhung der
Ausführungsgeschwindigkeit
wird die sogenannte Just-In-Time-(JIT)-Kompiliertechnik verwendet. Kurz vor
dem Starten der Ausführung
eines in virtuellen Maschinenbefehlen ausgedrückten Softwaremoduls, wird
das Modul in nativen Code kompiliert (ausgedrückt in nativen Maschinenbefehlen).
Auf diese Weise muss das Modul zusätzlich zu dem Code für den Compiler
zweimal gespeichert werden. Die zusätzlichen Speicheranforderungen
der Softwareinterpretation sind für eingebettete Systeme unerwünscht. Stattdessen
wird vorgezogen, einen Hardware-Interpreter zu verwenden. Ein Hardware-Interpreter ist an
sich in Form eines Prolog-Vorprozessors für den abstrakten Befehlssatz
von Warren bekannt. In dem Beitrag "A Prolog pre-processor for Warren's abstract instruc tion
set" von B. Knödler und
W. Rosenstiel, Microprocessing and Microprogramming 18 (1986) S.
71–81,
wird ein Vorprozessor zum Interpretieren von Programmen beschrieben,
die in der Prolog-Programmiersprache zum Laufen auf einem 68000-Prozessor
von Motorola (MC68000) geschrieben sind. Zum Übersetzen des Prolog-Quellenprogramms
in Befehle, die von Herrn Warren definiert worden sind und die im
Allgemeinen zum Ausführen
von Prolog-Programmen verwendet werden, wird ein Compiler verwendet.
Der Satz Warren-Befehle bildet eine virtuelle Maschine, die zum
Ausführen
von Prolog-Programmen entworfen sind. Die Sequenz aus Warren-Befehlen,
die sich aus der Kompilation ergibt, wird von dem MC68000 mit Hilfe
des Vorprozessors ausgeführt.
Nach dem Einschalten führt
der MC68000 zuerst einen Bootvorgang aus, indem er native MC68000-Befehle
ausführt.
Am Ende des Bootvorgangs ist der MC68000 bereit, um die Ausführung eines
Prolog-Programms zu initiieren. Dieses wird durch Springen zu einem
zuvor bestimmten Adressenbereich gestartet. Der Vorprozessor ist
eine speicherabgebildete Einrichtung, die auf diesen Bereich abgebildet
ist. Wenn der Vorprozessor adressiert wird, liest er einen Warren-Befehl
(des übersetzten
Prolog-Programms) aus seinem eigenen RAM, synthetisiert adaptiv
eine Sequenz aus MC68000-Befehlen und Konstanten und sendet diese
direkt zur CPU zur Ausführung.
Die MC68000-Befehle für
jeden Warren-Befehl sind im ROM des Vorprozessors gespeichert. Im
Allgemeinen übersetzt
der Vorprozessor einen Warren-Befehl
in eine Sequenz aus MC68000-Befehlen. Der Vorprozessor enthält seinen
eigenen RAM-Controller und ROM-Controller, die die Adressen für den RAM
und ROM des Vorprozessors generieren. Der RAM-Controller verwaltet
den RAM-Befehlszeiger. Jede aufeinander folgende Leseoperation des
MC68000 führt
dazu, dass der Vorprozessor den nächsten Befehl (und optionale
Konstanten) der Sequenz zur CPU sendet. Wenn die Sequenz abgeschlossen
ist, führt
eine nächste
Lese-Operation dazu, dass der erste Befehl der Sequenz dem nächsten Warren-Befehl
des zur CPU gesendeten Programms entspricht. Nach einer Unterbrechung
führt eine
wiederholte Lese-Operation der CPU zum erneuten Senden des letzten
Befehls (and optionaler Konstanten).
-
EP-A2-772122 offenbart das Übersetzen
von CISC-Befehlscode in RISC-Befehlscode,
wobei die CISC-Granularität
bei der Unterbrechungsbehandlung erhalten bleibt. EP-A2-263288 offenbart
Emulationsausführung
von Quellenbefehlen mit Gleitkomma. US-A04524415 offenbart einen
Datenprozessor als virtuelle Maschine, der einen fehlerhaften Befehl
ausschließen
kann, während
die Fehlerursache behoben wird. EP-A2-355961 offenbart einen Mikroprozessor,
der als zwei virtuelle Prozessoren konfiguriert ist, die gesonderte
Programmcontroller und eine gemeinsame Speicher- und Ausführungseinheit
haben und als zweistufige Pipeline angeordnet sind.
-
Der Erfindung liegt als Aufgabe zugrunde,
eine Prozessoreinrichtung der dargelegten Art zu verschaffen, die
zur Verwendung mit einem Mikrocontroller geeignet ist, der mehr
als einen Befehl gleichzeitig enthält.
-
Zur Lösung dieser Aufgabe ist der
Prozessor von einen Typ, der nach dem Auftreten einer zuvor bestimmten
Bedingung, wie z. B. einer Unterbrechung, Wiederzuführung bis
zu einem zuvor bestimmten Maximum von n nativen Befehlen anfordert,
mit n > 1; und umfasst
das Zuführmittel
Mittel, um, in Reaktion darauf, dass der Prozessor die Wiederzuführung einer
Anzahl nativer Befehle anfordert, die angeforderten nativen Befehle
erneut zuzuführen.
Der Erfinder hat erkannt, dass moderne Prozessoren mehrere native
Befehle gleichzeitig umfassen können,
wobei die Ausführung
des Befehls noch nicht begonnen worden ist oder noch nicht abgeschlossen
ist, und dass es zum Erhöhen
der Leistungsfähigkeit
wünschenswert
ist, die Fähigkeit
des Prozessors, mehr als einen Befehl zu enthalten, auszunutzen.
Der Erfinder hat die Erkenntnis gewonnen, dass zum Umgang mit der
Situation, in der der Prozessor zumindest einige der bereits geladenen
Befehle wegwirft und in einem späteren
Stadium Wiederzuführung
mehrerer Befehle anfordert (z. B. beim Auftreten bestimmter Bedingungen,
wie z. B. einer Unterbrechung), ein Wiederzuführungmechanismus zu Wiederzuführung der
angeforderten nativen Befehle zum Prozessor benötigt wird.
-
Die Erfindung ist gemäß Anspruch
1 definiert.
-
Gemäß der in dem abhängigen Anspruch
2 definierten Maßnahme
umfasst der Vorprozessor einen Zuführspeicher, wie z. B. einen
FIFO, zum Speichern von zuletzt zugeführten Befehlen und zur Wiederzuführung aus
dem Zuführspeicher,
wobei eine einfache und effektive Weise der Wiederzuführung der
Befehle verschafft wird. Angesichts der Tatsache, dass im Allgemeinen
ein virtueller Maschinenbefehl in eine Sequenz aus mehr als einem
nativen Befehl umgewandelt wird, kann der erste erneut zuzuführende native
Befehl ein beliebiger Befehl der Sequenz sein. Außerdem kann
der native Befehl einem früheren
virtuellen Maschinenbefehl entsprechen als dem derzeitigen. Schließlich kann
die Sequenzlänge
für unterschiedliche
virtuelle Maschinenbefehle unterschiedlich sein. Verwendung des
Zuführspeichers
ermöglicht
es, in einfacher Weise native Befehle aus dem Speicher erneut zuzuführen, statt
virtuelle Maschinenbefehle und die entsprechenden nativen Befehle
wieder aufzufinden.
-
Gemäß der in dem abhängigen Anspruch
3 definierten Maßnahme
können
Befehle, die aktiv in der Pipeline des Mikrocontrollers verarbeitet
werden, erneut zugeführt
werden. Dies macht den Vorprozessor besonders zur Verwendung in
Kombination mit einem RISC-Prozessor geeignet, der gewöhnlich eine
Pipeline-Architektur hat.
-
Gemäß der in dem abhängigen Anspruch
4 definierten Maßnahme
können
in dem Befehlscache des Prozessors gespeicherte Befehle erneut zugeführt werden.
Dies macht den Vorprozessor zur Verwendung in Kombination mit modernen
Prozessoren, wie z. B. RISC-Prozessoren geeignet, die gewöhnlich einen
Befehlscache aufweisen.
-
Gemäß der in dem abhängigen Anspruch
5 definierten Maßnahme
können
im Cache gespeicherte oder in der Pipeline verarbeitete Befehle
erneut zugeführt
werden.
-
Gemäß der in dem abhängigen Anspruch
6 definierten Maßnahme
ist der Zuführspeicher
imstande, zusätzlich
zu Befehlen, die eventuell erneut zugeführt werden müssen, auch
Befehle zu speichern, die zum ersten Mal zugeführt werden müssen. Auf
diese Weise kann der Vorprozessor vorab native Befehle erzeugen, bevor
der native Befehl tatsächlich
angefordert wird, wobei mögliche
Verzögerungen
beim Zuführen
eines erstmalig angeforderten Befehls zum Prozessor vermieden werden.
Außerdem
erlaubt dies die Verwendung nur eines einzigen Zuführmechanismus,
der für
das Zuführen
von erstmalig angeforderten Befehlen und das erneute Zuführen von
Befehlen sorgt.
-
Die in dem abhängigen Anspruch 7 definierte
Maßnahme
zeigt eine einfache und effektive Weise, um erstmaliges Zuführen und
Wiederzuführen
zu vereinigen. Die Befehle, die bereits zugeführt sind, und der (die) noch
zuzuführenden
Befehle) werden hintereinander in dem Zuführspeicher, wie z. B. einem
FIFO, gespeichert. Logisch behält
der Vorprozessor einen Zeiger bei, der eine Speicherstelle in dem
Zuführspeicher
anzeigt, die den Befehl enthält,
von dem erwartet wird, dass er als nächster angefordert wird (d.
h. den ersten Befehl, der noch nicht zuvor angefordert worden ist).
In der Praxis kann diese Speicherstelle immer an einer festen Position
des Zuführspeichers
lokalisiert sein, sodass kein gesonderte Zeiger beibehalten zu werden braucht.
Der Vorprozessor umfasst einen Zähler,
der eine Adresse des nativen Befehls anzeigt, von dem erwartet wird,
dass er vom Prozessor als nächster
zum erstmaligen Zuführen
angefordert wird. Normalerweise wird jedes Mal, das ein nativer
Befehl erstmalig zugeführt
wird, der Zähler
erhöht.
Der Prozessor zeigt (unter Verwendung eines Befehlszeigers) eine
Adresse des Befehls an, der als nächster vom Prozessor benötigt wird.
Dies kann eine Anforderung für
eine erstmalige Zuführung
oder eine Wiederzuführung
eines Befehls sein. Der Vorprozessor vergleicht die angeforderte
Adresse mit der im Zähler
gespeicherten Adresse. Anhand des Offset wird der Befehl im Zuführspeicher
lokalisiert. Der Zähler
kann beispielsweise die Adresse des Befehls speichern, von dem erwartet
wird, dass er als nächster
angefordert wird, wobei diese um eins höher ist als die Adresse des
zuletzt zugeführten
Befehls. Wenn der Prozessor tatsächlich
diesen neuen Befehl anfordert, ist der Offset gleich null. Wenn
der Logikzeiger auf die Stelle des neuen Befehls weist, wird der
an dieser Stelle gespeicherte Befehl dem Prozessor zugeführt. Wenn
der Prozessor Wiederzuführung
des vorhergehenden Befehls anfordert, kann der Offset eins oder
minus eins sein (in Einheiten eines Befehls gezählt, was in Einheiten von Bytes
für einen
32-Bit-Befehl 4 sein kann). Durch Subtrahieren (oder Zuführen) des
Offset von dem Zeiger aus wird der angeforderte Befehl lokalisiert.
Es versteht sich auch, dass der Zähler und der Logikzeiger nicht
die genaue Adresse/Stelle des Befehls zu speichern brauchen, von
dem erwartet wird, dass er als nächster
angefordert wird. Beispielsweise kann der Logikzeiger auch den letzten
zugeführten
Befehl anzeigen.
-
Die in dem abhängigen Anspruch 8 definierte
Maßnahme
zeigt eine alternative Anordnung, bei der kein zusätzlicher
Zuführspeicher
benötigt
wird. Stattdessen speichert der Vorprozessor Zustandsinformationen,
die ein erneutes Erzeugen der von dem Prozessor zur Wiederzuführung angeforderten
Befehle ermöglichen.
Als Beispiel können,
statt Zuführbefehle
in einem Zuführspeicher
zu speichern, auch Zeiger, die Befehle oder Informationen anzeigen,
die zum anfänglichen
Erzeugen der Befehle verwendet worden sind, in einem Speicher gespeichert
werden.
-
Bei der in dem abhängigen Anspruch
9 definierten Maßnahme
ist ein Teil des Zustands in dem Befehlszeiger des Mikrocontrollers
gespeichert, was die Kosten des Vorprozessors verringern kann.
-
Bei der in dem abhängigen Anspruch
10 definierten Maßnahme
umfasst der Vorprozessor für
zumindest einen virtuellen Maschinenbefehl eine entsprechende Übersetzungstabelle,
um den virtuellen Maschinenbefehl in eine Sequenz aus nativen Befehlen
zu übersetzen.
Die Übersetzungstabelle
kann beispielsweise im ROM gespeichert sein. Der niedrigstwertige
Teil des Befehlszeigers des Prozessors wird verwendet, um anzuzeigen,
welcher der nativen Befehle in der Tabelle benötigt wird (d. h. der niedrigstwertige
Teil des Befehlsszeigers wirkt als Übersetzungstabellenoffsetindikator).
Im normalen Betrieb erhöht
der Prozessor den Befehlszeiger automatisch. Vorteilhafterweise
braucht der Vorprozessor keinen eigenen Zähler zu speichern und diesen
Zähler
zu erhöhen,
um den als nächsten
zu lesenden erwarteten nativen Befehl anzuzeigen. Wenn der Prozessor
eine Wiederzuführung
anfordert, wird der Prozessor automatisch den Befehlszeiger auf
einen vorhergehenden Wert setzen. Auf diese Weise kann auch automatisch
für Wiederzuführung gesorgt
werden.
-
Die in dem abhängigen Anspruch 11 definierte
Maßnahme
verschafft eine wirksame Möglichkeit,
um zusätzlich
zu dem Übersetzungstabellenoffset
auch die Übersetzungstabelle
zu bestimmen, in der der angeforderte native Befehl lokalisiert
ist. Ein zuvor bestimmter weiterer Teil des Befehlsszeigers umfasst
einen virtuellen Maschinenbefehlszeiger, der einen virtuellen Maschinenbefehl
in dem Befehlsspeicher anzeigt. Dieser virtuelle Maschinenbefehlszeiger
kann als Programmzähler
einer virtuellen Maschine angesehen werden, der jedes Mal erhöht werden
muss, wenn ein neuer virtueller Maschinenbefehl benötigt wird.
Der Vorprozessor ruft den durch den virtuellen Maschinenbefehlszeiger
angezeigten virtuellen Maschinenbefehl aus dem Befehlsspeicher ab
und lokalisiert anhand des abgerufenen virtuellen Maschinenbefehls
die Übersetzungstabelle.
Der niedrigstwertige Teil des Befehlsszeigers des Prozessors wird
dann in der Übersetzungstabelle
als Offset verwendet. Immer wenn eine zu einem einzigen virtuellen
Maschinenbefehl gehörende
Sequenz aus nativen Befehlen abgeschlossen worden ist, kann der
virtuelle Maschinenbefehlszeiger gesetzt werden, um den nächsten virtuellen
Maschinenbefehl anzuzeigen, beispielsweise indem als letzter nativer
Befehl in der Sequenz ein expliziter Sprung verwendet wird, der
den virtuellen Maschinenbefehlszeiger auf den Sollwert setzt und
den Übersetzungsoffsetteil
des Befehlsszeigers zurücksetzt
oder durch Verwenden eines oder mehrerer NOP-Befehle (NOP: no operation, Nulloperation),
sodass schließlich
ein Überlauf
des Übersetzungsoffsetteils
dazu führt, dass
der Prozessor den virtuellen Maschinenbefehlszeiger erhöht. Es versteht
sich, dass nicht gefordert wird, dass jede Anforderung aus dem Prozessor
für einen
Befehl zum Abrufen eines virtuellen Maschinenbefehls aus dem Befehlsspeicher
führt.
Vorteilhafterweise umfasst der Vorprozessor einen Cache zum Speichern
bereits aus dem Befehlsspeicher abgerufener oder abgerufen zu werden
erwarteter virtueller Maschinenbefehle.
-
Vorteilhafterweise enthält die Übersetzungstabelle
als Alternative zu einem vollständigen
nativen Befehl ein natives Befehlsgerippe für zumindest native Befehle
mit variablen Teilen. Das Gerippe umfasst zuvor bestimmte feste
Teile des nativen Befehls, wie z. B. den Operationscode, während variable
Elemente des Befehls, wie z. B. bestimmte Ope randen, adaptiv geladen
werden, beispielsweise aus Parametern des entsprechenden virtuellen
Maschinenbefehls.
-
Die in dem abhängigen Anspruch 12 definierte
Maßnahme
verschafft eine Alternative für
die Verwendung des virtuelle Maschinenbefehlszeigers. Bei dieser
Ausführungsform
ist die Übersetzungstabelle
in mehrere Subtabellen unterteilt, wobei zumindest eine der Subtabellen
eine Sequenz aus nativen Befehlen oder nativen Befehlsgerippen umfasst.
Eine Subtabelle kann, aber muss nicht einer vollständigen Sequenz
aus nativen Befehlen entsprechen, die einem einzigen virtuellen
Befehl entsprechen. In der Praxis kann vorgezogen werden, eine Subtabellengröße von nur
4 oder 8 nativen Befehlen zu wählen,
was weniger als die maximale Sequenz nativer Befehle für einen
virtuellen Maschinenbefehl sein kann. Der Übersetzungstabellenoffsetindikator
zeigt einen Offset in einer der Subtabellen an. Ein zuvor bestimmter
weiterer Teil des Befehlsszeigers umfasst einen Subtabellenindikator.
Der Vorprozessor nutzt den Wert des Subtabellenindikators, um die
tatsächlich
beteiligte Subtabelle zu lokalisieren. Vorzugsweise wird im Normalbetrieb
der Subtabellenindikator jedes Mal, wenn ein nativer Befehl aus
einer nächsten
Subtabelle abgerufen wird, um eine Einheit erhöht (unabhängig davon, ob die Subtabelle
sich auf den gleichen oder verschiedene virtuelle Maschinenbefehle
bezieht). Der Vorprozessor kann Zeiger zu der (den) verwandten Subtabelle(n)
für die
zuletzt verwendeten Subtabellenindikatoren speichern. Insbesondere
für relativ
kleine Subtabellen kann eine Sequenz aus nativen Befehlen, die sich
auf einen einzigen virtuellen Maschinenbefehl beziehen, durch NOP-Befehle ergänzt werden, um
dafür zusorgen,
dass die Sequenz an einer Subtabellengrenze endet (Beseitigen der
Verwendung von Sprungoperationen, um den Wert des Subtabellenindikatorteils
des Befehlsszeigers zu korrigieren). Die meisten Prozessoren können eine
Nulloperation bedeutend schneller ausführen als eine Sprungoperation.
-
Die in dem abhängigen Anspruch 13 definierte
Maßnahme
sorgt dafür,
dass keine Blockade-Situation auftreten kann, bei der der Prozessor
einen Befehl angefordert hat und den Bus blockiert, bis der Befehl
abgegeben worden ist, während
der Vorprozessor zuerst einen (virtuellen Maschinen-)Befehl aus
dem Befehlsspeicher über
den gleichen Bus erhalten muss, bevor er den nativen Befehl abgeben
kann.
-
Der erfindungsgemäße Vorprozessor ist in Anspruch
14 definiert.
-
Ausführungsbeispiele der Erfindung
sind in der Zeichnung dargestellt und werden im Folgenden näher beschrieben.
Es zeigen:
-
1 vier
mögliche
Architekturen für
das Anordnen des Vorprozessors in der Verarbeitungseinrichtung;
-
2 eine Übersetzungstabelle
zum Übersetzen
eines virtuellen Maschinenbefehls in eine Sequenz aus nativen Befehlen;
-
3 ein
Blockschaltbild einer Ausführungsform
der Verarbeitungseinrichtung, in der ein Zuführspeicher zur Wiederzuführung von
Befehlen verwendet wird;
-
4 eine
uniforme Weise der Zuführung
und Wiederzuführung
von Befehlen;
-
5 die
Verwendung des Befehlszeigers des Prozessors als Index in die Übersetzungstabelle;
und
-
6 eine
alternative Verwendung des Befehlsszeigers.
-
1 veranschaulicht
vier mögliche
Architekturen für
das Anordnen des Vorprozessors in der Verarbeitungseinrichtung 100.
Drei Hauptbestandteile der Verarbeitungseinrichtung 100 sind
der Mikrocontroller 110, der Befehlsspeicher 120 und
der Vorprozessor 130. In allen Figuren umfasst der Mikrocontroller 110 den Befehlsspeicher 120 und
den Vorprozessor 130. Die Verarbeitungseinrichtung 100 wird
nicht explizit dargestellt. Durch Kombinieren aller Hauptelemente
im Mikrocontroller 110, der vorzugsweise eine Einzelchip-Anordnung
ist, kann optimales Leistungsvermögen erreicht werden. Es versteht
sich, dass auf Wunsch der Befehlsspeicher 120 und/oder
der Vorprozessor 130 außerhalb des Mikrocontrollers 110 lokalisiert
werden können,
wo der Mikrocontrollerbus 140 außerhalb des Mikrocontrollers 110 verläuft und
beispielsweise an einen externen Bus wie z. B. PCI gekoppelt ist.
-
Der Befehlsspeicher 120 enthält virtuelle
Maschinenbefehle, wie z. B. Befehle für eine Stapelmaschine. Ein
Beispiel für
solche virtuellen Maschinenbefehle sind Java-Bytecodes. Der Mikrocontroller 110 umfasst einen
Prozessor 112 mit einem zuvor bestimmten Mikrocontrollerkern 114,
als native Maschine bezeichnet, zum Ausführen nativer Befehle aus einem
zuvor bestimmten Satz von mikrocontrollerspezifischen Befehle. Ein Beispiel
für einen
zum Ausführen
eingebetteter Software geeigneten Mikrocontroller ist ein RISC-Mikrocontroller,
wie z. B. die Mikroprozessorreihe MIPS PR3001. Die nativen Befehle
des Mikrocontrollerskerns 114 unterscheiden sich von den
virtuellen Maschinenbefehlen der virtuellen Maschine. An sich ist
der Mikrocontroller 110 nicht imstande, im Befehlsspeicher 120 gespeicherte
virtuelle Maschinenbefehle direkt auszuführen. In Reaktion darauf, dass
der Prozessor 110 einen Befehl anfordert, gibt der Vorprozessor 130 den
nativen Befehl aus. Um den nativen Befehl erzeugen zu können, kann
der Vorprozessor 130 unter Verwendung von Abrufmitteln 134 einen
virtuellen Maschinenbefehl aus dem Befehlsspeicher 120 abrufen.
Der Vorprozessor 130 umfasst einen Umsetzer 132 zum
Umsetzen eines aus dem Befehlsspeicher 120 abgerufenen
virtuellen Maschinenbefehls in zumindest einen nativen Befehl. Im
Allgemeinen wird ein virtueller Maschinenbefehl in eine Sequenz
aus nativen Befehlen umgewandelt. Der Vorprozessor 130 umfasst
weiter ein Zuführmittel 136,
um dem Mikrocontrollerkern native Befehle der Sequenz zur Ausführung zuzuführen. Bei
Ausführen
eines virtuellen Maschinenprogamms führt der Mikrocontroller 110 praktisch
ein vom Vorprozessor 130 generiertes natives Programm aus.
Wo normalerweise ein Befehlszeiger des Mikrocontrollers 110 den
nächsten
Befehl in dem Befehlsspeicher 120 anzeigt, den der Mikroprozessor 110 benötigt, um
ihn als nächsten
auszuführen,
zeigt jetzt der Befehlszeiger dem Vorprozessor 130 an,
dass ein nächster
nativer Befehl benötigt
wird (oder eine Wiederzuführung
eines vorhergehenden Befehls). Logisch verwaltet der Vorprozessor 130 einen
unabhängigen
virtuellen Maschinenbefehlszeiger, der den derzeitigen (oder nächsten)
virtuellen Maschinenbefehl in dem Befehlsspeicher 120 anzeigt.
Der Mikrocontroller hat keine (explizite) Kenntnis des virtuellen
Maschinenbefehls oder des virtuellen Maschinenbefehlszeigers.
-
Der Prozessor 112 ist von
einem Typ, der nach dem Auftreten einer zuvor bestimmten Bedingung
Wiederzuführung
von bis zu einem zuvor bestimmten Maximum von n nativen Befehlen
anfordert, mit n > 1.
Eine derartige Bedingung kann eine Unterbrechung sein, die bewirkt,
dass der Prozessor bereits in dem Prozessor vorhandene Befehle verwirft.
Ein Prozessor 112 mit eine k-stufigen Pipeline wird normalerweise
gleichzeitig an k Befehlen arbeiten. Das Auftreten der Bedingung
kann zum Verwerfen aller k Befehle führen. Ein weiterer Grund zum
Verwerfen von mehr als einem Befehl liegt vor, wenn der Prozessor
einen Befehlscache 116 zum Speichern von bis zu h Befehlen
umfasst. Das Auftreten der Bedingung kann zum Verwerfen aller h
Befehle in dem Cache 116 führen. In einem späteren Stadium
kann der Prozessor 112 zur Ausführung des virtuellen Maschinenprogramms
zurückkehren
und Wiederzuführung
von mehr als einem Befehl anfordern. Hierzu umfasst das Zuführmittel 136 Mittel,
um, in Reaktion darauf, dass der Prozessor 112 die Wiederzuführung einer
Anzahl nativer Befehle anfordert, die angeforderten nativen Befehle
erneut zuzuführen.
-
Es versteht sich, dass der Befehlsspeicher 120 auch
native Befehle enthalten kann. Solche nativen Befehle können beispielsweise
zum Initialisieren des Systems verwendet werden oder um zu erlauben,
gewisse Softwaremodule, wie z. B. Treiber oder spezielle Teile der
eingebetteten Softwareanwendung, für optimales Leistungsvermögen in native
Befehle zu kompilieren. Eine Unterscheidung zwischen nativen Befehlen
und virtuellen Maschinenbefehlen im Befehlsspeicher 120 kann
hinsichtlich der Adresse des Befehls vorgenommen werden, wo ein
zuvor bestimmter Adressenbereich für virtuelle Maschinenbefehle
zur Verfügung
gestellt wird. Andere Alternativen enthalten Verwendung eines speziellen
Bit für
jeden Befehl, das anzeigt, ob der Befehl ein nativer Befehl oder
ein virtueller Maschinenbefehl ist; oder Verwendung eines speziellen
Registers, das den derzeitigen Typ des Befehls anzeigt, bei dem
der Inhalt des Registers jedes Mal, wenn eine Typänderung
auftritt, geändert
werden muss. Der Vorprozessor 130 sorgt dafür, dass
native Befehle vom Befehlsspeicher 120 unverändert zum
Prozessor 112 weitergeleitet werden.
-
In 1A sind
die Hauptbestandteile der Verarbeitungseinrichtung über einen
allgemeinen Peripherie-Bus 140, wie z. B. den PI-Bus (PI:
peripheral interconnect), miteinander verbunden. Der Vorprozessor 130 ist
ein Peripheriegerät
auf dem Bus. Der Vorprozessor 130 kann als speicherabgebildetes
Peripheriegerät
wirken, wo ein zuvor bestimmter Adressenbereich dem Vorprozessor
zugewiesen wird. In Reaktion darauf, dass der Prozessor 110 auf
dem Bus 140 eine Anforderung für einen Befehl mit einer Adresse
in diesem Bereich ausgibt, gibt der Vorprozessor 130 den
nativen Befehl auf dem Bus 140 aus. Nötigenfalls ruft der Vorprozessor 130 einen
virtuellen Maschinenbefehl aus dem Befehlsspeicher 120 über den
Bus 140 ab.
-
In 1B und 1C liegt der Vorprozessor 130 zwischen
dem Mikrocontroller 110 und dem Befehlsspeicher 120.
Falls der Vorprozessor 130 zwischen nativen und virtuellen
Maschinenbefehle unterscheiden muss, können diese Konfigurationen
die Ausführung
von in dem Befehlsspeicher 120 gespeicherten nativen Befehlen verzögern. Der
Deutlichkeit halber werden nicht alle in 1A gezeigten Elemente in 1B, 1C und 1D wiederholt.
-
In 1D ist
der Vorprozessor 130 im Mikrocontroller 110 eingebettet.
Der Vorprozessor 130 liegt vorzugsweise zwischen einem
Befehlscache 116 des Mikrocontrollers 110 und
dem Kern 114. Diese Konfiguration berücksichtigt optimales Leistungsvermögen, aber
erfordert, im Unterschied zu den Konfigurationen von 1A, 1B und 1C Ände rungen
am Mikrocontroller 110 und als solcher kann der Vorprozessor 130 nicht
für verschiedene
Mikrocontrollertypen als Standardentwurf verwendet werden.
-
Der Umsetzer
132 wird zum
Umsetzen eines virtuellen Maschinenbefehls, der aus dem Befehlsspeicher
120 abgerufen
wurde, in zumindest einen nativen Befehl verwendet. Als Beispiel
fhat der Java-Bytecode (ein virtueller Maschinenbefehl) für Ganzzahladdition
(0x60) das Addieren der zwei oberen Elemente des Stapels, Entfernen
der zwei oberen Elemente vom Stapel und Schieben der Summe auf den
Stapel zur Folge. Dieser virtuelle Maschinenbefehl kann in die folgende
Sequenz aus Befehlen (native Befehle) für einen MIPS-Prozessor (eine
32-Bit-Maschine) umgewandelt werden, wobei $tosp ein Register ist,
das auf die erste leere Stelle des Stapels weist (über der
Stapelspitze):
| lw
$a0, 4 ($tosp) | /*
das obere Element des Stapels in Register $a0 laden |
| lw
$a1, 8 ($tosp) | /*
das zweite Element des Stapels in $a1 laden |
| add
$a0, $a1, $a0 | /*
$a0 und $a1 addieren, Summe in $a0 platzieren |
| addi
$tosp, $tosp, 4 | /*
den Stapel um ein Element erniedrigen |
| sw
$a0, 4 ($tosp) | /*
die Summe in der neuen Stapelspitze speichern |
-
Vorzugsweise umfasst der Umsetzer 132 eine
Tabelle zum Umsetzen eines virtuellen Maschinenbefehls in eine Sequenz
aus nativen Befehlen. Es kann eine eindimensionale Tabelle verwendet
werden, bei der jede Zelle der Tabelle eine Sequenz aus nativen
Befehlen für
einen einzigen entsprechenden virtuellen Maschinenbefehl umfasst.
Die Zellennummer kann dem Wert des entsprechenden virtuellen Maschinenbefehls entsprechen.
Als Beispiel kann die Sequenz aus nativen Befehlen für die Java-Ganzzahladdition
(0x60) in Zelle 96 (= 0x60 in Hexadezimal-Schreibweise)
lokalisiert sein. Da die Länge
der Sequenz aus nativen Befehlen für die verschiedenen virtuellen
Befehle erheblich variieren kann, sind die Sequenzen vorzugsweise
in einer eindimensionalen Tabelle ohne explizite Zellen lokalisiert,
wo die Sequenzen einander unmittelbar folgen. Eine derartige Übersetzungstabelle 200 wird
in 2 gezeigt, wo die
impliziten Zellengrenzen mit gestrichelten Linien angedeutet werden.
Um eine Sequenz für
einen virtuellen Maschinenbefehl lokalisieren zu können, kann eine
Code-Indextabelle 210 verwendet werden, die für jeden
virtuellen Maschinenbefehl (VMI 1 bis VMI N) den Anfangspunkt der
entsprechenden Sequenz in der Übersetzungstabelle 200 anzeigt.
Für die
Zelle der Übersetzungstabelle 200,
die VMI 3 entspricht, wird die zugehörige Sequenz 220 aus
nativen Befehlen NI 1 bis NI M gezeigt.
-
Ein weiteres Beispiel für eine Umsetzung
wird für
den Java-Bytecode bipush n (zur Vorzeichenerweiterung von Byte n
und zum Platzieren des Ergebnisses auf der Spitze des Stapels verwendet)
gegeben. Dieser virtuelle Maschinenbefehl besteht aus zwei Bytes
(0x16 und n), wobei das erste Byte die Operation spezifiziert und
das zweite Byte den Parameter n liefert. Der Befehl kann in die
folgende Sequenz aus nativen MIPS-Befehlen umgewandelt werden:
| ori
$a0, $0, n | /*
Register $a0 mit Konstante n * laden/ |
| sll
$a0, $a0, 24 | /*
um 24 Bits nach links schieben*/ |
| sra
$a0, $a0, 24 | /*
arithmetisch nach rechts schieben, was Vorzeichenerweiterung bewirkt,
durch Nachbilden des letzten am weitesten linken Bit */ |
| sw
$a0, 0 ($tosp) | /*
Ergebnis auf der neuen Stapelspitze speichern*/ |
| addi
$tosp, –4 | /*
Stapelgröße erhöhen */ |
-
Dieses Beispiel veranschaulicht,
dass ein virtueller Maschinenbefehl parametrisiert sein kann, wobei einem
Operationscode zumindest ein Operand folgt. Vorteilhafterweise umfasst
der Umsetzer 132 eine Übersetzungstabelle 200,
wo native Befehle entweder durch den vollständigen Code oder durch ein
Befehlsgerippe repräsentiert
werden. Beispielsweise enthält
der Befehl addi $tosp, –4
(letzter Befehl der Sequenz des vorhergehenden Beispiels) keine
variablen Teile und kann vollständig
als 4-Byte-Eintrag in der Tabelle lokalisiert sein. Der Befehl ori
$a0, $0, n (erster Befehl der Sequenz des vorhergehenden Beispiels)
enthält
einen variablen Teil und kann in der Tabelle als Gerippe lokalisiert
sein, wobei der variable Teil (der n ist) nicht spezifiziert ist. Vorzugsweise
hat der Eintrag in der Tabelle für
ein Befehlsgerippe die gleiche Breite wie ein vollständiger Befehl
(z. B. 4 Bytes für
einen MIPS-Prozessor), was eine uniforme Tabelle zulässt. Weitere
Information kann in der Tabelle (oder in (einer) separaten Tabelle(n))
lokalisiert sein, um anzuzeigen, wie der nicht spezifizierte Teil des
nativen Befehlsgerippes ausgefüllt
werden sollte. Vorteilhafterweise wird Mikroprogrammierung verwendet,
um die nicht spezifizierten Teile auszufüllen. Die weitere Information
kann dann Mikrocode umfassen oder anzeigen. Es versteht sich, dass
es vorteilhaft ist, für
ein Befehlsgerippe eine gleiche Struktur (Breite und Zusammensetzung)
zu verwenden wie für
einen vollständigen
nativen Befehl. Es können
jedoch ebenso gut andere Strukturen verwendet werden.
-
Wenn die virtuelle Maschine eine
stapelorientierte Maschine ist, werden vorzugsweise der Stapel oder zumindest
die oberen Elemente des Stapels auf Register des Mikrocontrollers 110 abgebildet.
Auf diese Weise wird der Speicherstapel (mit dem virtuellen Maschinenstapel)
auf den Registerstapel abgebildet. Unter der Annahme, dass die Re gister
$r1, $r2 und $r3 drei aufeinander folgende Elemente des Speicherstapels
enthalten, wobei anfangs $r1 der ersten leeren Stelle des Speicherstapels
(über der
Spitze des Stapels) entspricht, $r2 die Spitze des Speicherstapels
und $r3 das zweite Element des Speicherstapels enthält, kann
der Java-Bytecode bipush n in die folgende Sequenz aus nativen MIPS-Befehlen umgewandelt
werden:
ori $r1, $0, n
sll $r1, $r1, 24
sra $r1,
$r1, 24
-
Nach dieser Operation enthält $r1 die
Spitze des Speicherstapels.
-
Ebenso kann der Java-Bytecode (ein
virtueller Maschinenbefehl) für
Ganzzahladdition (0x60) in die folgende Sequenz aus nativen MIPS-Befehlen
umgewandelt werden, ausgehend von der gleichen Position, wo anfangs
$r1 der ersten leeren Stelle des Speicherstapels (über der
Spitze des Stapels) entspricht, $r2 die Spitze des Speicherstapels
und $r3 das zweite Element des Speicherstapels enthält:
add
$r3, $r2, $r3
-
Nach dieser Operation enthält $r3 die
Spitze des Speicherstapels.
-
In den obigen Beispielen wird vorzugsweise
die Position der Spitze des Speicherstapels (d. h. welches Register
die Spitze des Speicherstapels enthält) mittels eines Registers
138 des
Umsetzers
132 angezeigt. Der Umsetzer nutzt das Register
138,
als Registerstapelzeiger (RSP), um die geeigneten nativen Befehle
zu erzeugen. Vorzugsweise wird Mikroprogrammierung verwendet, um
die Registeroperanden der nativen Befehle zu spezifizieren. Auf
diese Weise sind auch feste native Befehle variabel geworden, da
die Registeroperanden durch den Umsetzer
132 spezifiziert
werden müssen.
Vorzugsweise werden solche Operanden auch in der Übersetzungstabelle
200 unter
Verwendung von Befehlsgerippen gespeichert. Unter der Annahme, dass RSP
auf das erste freie Register weist, kann der Java-Bytecode bipush
n in die folgende Sequenz aus nativen MIPS Befehlen unter Steuerung
des entsprechenden Mikrocodes umgesetzt werden:
| Mikrocode | Befehle |
| rsp –= 1; ftg = rsp + 1 | ori
$(rsp + 1), $0, n |
| ftg = rsp + 1; fao =
rsp + 1 | sll
$(rsp + 1), $(rsp + 1), 24 |
| ftg = rsp + 1; fao =
rsp + 1 | sra
$(rsp + 1), $(rsp + 1), 2 |
wobei f
tg das Zielregister
für den
Befehl anzeigt, und f
a0 und f
a1 das
erste bzw. zweite Argumentregister für den Befehl anzeigen. Ein
folgender Java-Bytecode iadd zum Addieren der zwei oberen Elemente
des Stapels würde
zu dem folgenden Mikrocode und Befehl führen:
f
tg =
rsp + 2; f
ao = rsp + 2; f
a1 =
rsp + 1; rsp += 1
add $(rsp + 2), $(rsp + 2), $(rsp + 1)
-
3 veranschaulicht
eine erfindungsgemäße Ausführungsform,
bei der der Vorprozessor 130 einen Zuführspeicher 300 umfasst.
Der Zuführspeicher 300 umfasst
einen Teil 310 zum Speichern von zumindest n Befehlen,
die zuletzt dem Prozessor zugeführt
worden sind (wobei n die maximale Anzahl nativer Befehle ist, für die der
Prozessor Wiederzuführung
anfordern könnte).
In Reaktion darauf, dass der Prozessor 112 Wiederzuführung einer
Anzahl Befehle anfordert, führt
das Zuführmittel 136 die
angeforderten Befehle erneut aus dem Zuführspeicher 300 zu.
Vorzugsweise hat der Zuführspeicherteil 310 eine
FIFO-Funktion 136. Jedes Mal, wenn dem Prozessor 112 erstmalig
ein Befehl zugeführt
wird, wird der Befehl in den Teil 310 geladen und, falls der
Teil 310 voll ist, der älteste
Befehl entfernt. Vorteilhafterweise ist für einen Mikrocontroller mit
einer k-stufigen Pipeline n gleich oder größer als k. Ebenso ist für einen
Prozessor mit einem Befehlscache zum Speichern bis zu h Befehlen
n gleich oder größer als
h. Wenn sowohl eine k-stufige Pipeline als auch ein Befehlscache zum
Speichern bis zu h Befehlen, ist n vorzugsweise gleich oder größer als
k + h.
-
Bei einer weiteren erfindungsgemäßen Ausführungsform
umfasst der Zuführspeicher 300 Speicherstellen 320 zum
Speichern weiterer m nativer Befehle, mit m ≥ 1. Dies erlaubt es dem Vorprozessor 130,
bis zu m native Befehle vor dem erstmaligen Zuführen zum Prozessor zu erzeugen
und die zusätzlichen
Befehle auch im Zuführspeicher 300 zu
speichern. Vorzugsweise hat der Teil 320 des Zuführspeichers 300 eine FIFO-Funktion.
Jedes Mal, wenn ein Befehl dem Prozessor 112 zugeführt wird,
wird dieser Befehl aus dem Teil 320 entfernt und in den
Teil 310 eingegeben. Der Vorprozessor 130 gibt
die Befehle in den Teil 320 ein. Vorzugsweise werden die
zwei Speicherteile 310 und 320 des Zuführspeichers 300 kombiniert.
Dies kann mittels eines einzigen einheitlichen FIFO implementiert
werden. Andere Alternativen, wie z. B. zyklische Speicher mit entsprechendem
Zeiger, können
auch verwendet werden.
-
Bei einer weiteren erfindungsgemäßen Ausführungsform
wird ein einheitlicher Mechanismus zum erstmaligen Zuführen und
zum erneuten Zuführen
von nativen Befehlen aus dem Zuführspeicher 300 zum
Prozessor 112 verwendet. Der Zuführspeicher 300 speichert
Befehle, die hintereinander erstmalig zugeführt werden sollen (Teil 320)
oder aufeinander folgend erneut zugeführt werden sollen (Teil 310),
wie in 4 veranschaulicht.
Der Vorprozessor 130 umfasst einen Zähler 400, der eine
Adresse eines nativen Befehls anzeigt, von dem erwartet wird, dass
er von dem Prozessor als nächster
zum erstmaligen Zuführen
angefordert wird. Der Zähler 400 kann
als der erwartete Befehlszeiger betrachtet werden. Der Vorprozessor 130 empfängt vom
Prozessor einen tatsächlichen
Befehlszeiger 410, der den tatsächlich angeforderten nativen
Befehl anzeigt. Dies kann der erwartete Befehl sein, aber es kann
auch ein bereits zugeführter
Befehl sein. Der Vorprozessor 130 umfasst Mittel, um einen
Offset einer tatsächlichen
Adresse eines vom Prozessor angeforderten Befehls (410) in
Bezug auf die in dem Zähler 400 gespeicherte
Adresse zu bestimmen. Es wird ein Subtrahierer 420 zum Subtrahieren
des erwarteten und des empfangenen Befehlszeigers gezeigt. Wenn
der empfangene Befehlszeiger vom erwarteten Befehlszeiger subtrahiert
wird, liegt das Ergebnis im Bereich von 0 bis n, wobei 0 anzeigt,
dass der erste neue Befehl angefordert ist, und die anderen Werte
eine Anforderung für
Wiederzuführung
anzeigen. Anhand des Offset wird der Befehl im Zuführspeicher 300 lokalisiert
und dem Prozessor 112 zugeführt. Vorzugsweise erfolgt das
Lokalisieren durch Kombinieren des Offset mit einem Wert eines Zeigers zum
Zuführspeicher 300.
Es wird ein Zeiger 430 gezeigt, der den ersten nativen
Befehl anzeigt, der noch nicht dem Prozessor 112 zugeführt worden
ist (d. h. der Befehl, von dem erwartet wird, dass unter normalen
Umständen
zugeführt
wird). Ein Subtrahierer 440 subtrahiert den Offset vom
Wert des Zeigers 430. Der resultierende Wert zeigt auf
den gewünschten
Befehl. Nachdem der Vorprozessor 130 die erwarteten und
die empfangenen Befehlszeiger verglichen hat, wird der erwartete
Befehlszeiger normalerweise auf den empfangenen Befehlszeiger +
1 Befehl gesetzt (für
einen 4-Byte-Befehl kann dies Erhöhen des Zählers 400 um 4 bedeuten). Je
nach der für
den Zuführspeicher 300 gewählten Anordnung
kann es notwendig sein, den Wert des Zeigers 430 jedes
Mal, wenn ein Befehl zum ersten Mal dem Prozessor 112 zugeführt wird,
um eins zu erhöhen.
Wenn beispielsweise für
den Zuführspeicher
ein Schieberegister verwendet wird, in dem ein erstmaliges Zuführen eines
Befehls zu einer Verschiebung führt,
ist dies nicht erforderlich.
-
Als Alternative zur Verwendung des
Zuführspeichers 300 umfasst
der Vorprozessor 130 Speichermittel zum Speichern eines
Zustandes des Vorprozessors, der das Regenerieren von zumindest
n Befehlen, die zuletzt dem Prozessor zugeführt worden waren, ermöglicht.
Beispielsweise könnte
der Vorprozessor 130 zum Speichern von Zeigern zu den zuletzt
zugeführten
n Befehlen oder anderer Zustandsinformation, die es erlaubt, einen
dieser Befehle zu lokalisieren oder anderenfalls zu regenerieren,
einen Speicher umfassen, der ähnlich
dem Zuführspeicher 130 ist.
Das Zuführmittel 136 ist
ausgebildet, um, in Reaktion darauf, dass der Prozessor die Wiederzuführung einer
Anzahl Befehle anfordert, die angeforderten Befehle durch Regenerieren der
Befehle auf Basis des gespeicherten Zustandes erneut zuzuführen.
-
Vorteilhafterweis ist bei einer weiteren
Ausführungsform
das Speichermittel ausgebildet, um zumindest einen Teil des Zustands
in einem Befehlszeiger des Mikrocontrollers zu speichern. Dies kann
in einfacher Weise ausgeführt
werden, indem ein Sprungbefehl an den Mikrocontroller ausgegeben
wird, der den Befehlszeiger auf einen Wert setzt, der den Teil des
Zustands wiederspiegelt. Das Zuführmittel 136 ist
ausgebildet, um den gespeicherten Teil aus dem Befehlszeiger zurückzugewinnen.
-
5 veranschaulicht
das Speichern eines Teils des Zustands in dem Befehlszeiger. Der
Vorprozessor 130 umfasst für zumindest einen virtuellen
Maschinenbefehl eine entsprechende Übersetzungstabelle zum Übersetzen
des virtuellen Maschinenbefehls in eine Sequenz aus nativen Befehlen.
Die Übersetzungstabelle kann
beispielsweise im ROM gespeichert sein. Die Übersetzungstabelle kann eine
Zelle 220 der bereits eher beschriebenen Tabelle sein,
für die
in 2 ein Beispiel gezeigt
wird. Bei dieser alternativen Ausführungsform wird der niedrigstwertige
Teil des Befehlsszeigers des Prozessors verwendet, um anzuzeigen,
welcher der nativen Befehle (z. B. NI 1 bis NI n) in der Tabelle
benötigt
wird (d. h. der niedrigstwertige Teil des Befehlsszeigers wirkt
als Übersetzungstabellenoffsetindikator).
Dieser Teil kann beispielsweise 5 Bits breit sein, was ein Maximum
von 32 nativen Befehle für
einen virtuellen Maschinenbefehl berücksichtigt, ohne weitere Maßnahmen
zu treffen. Beim Normalbetrieb erhöht der Prozessor 112 automatisch
den Befehlszeiger. Vorteilhafterweise braucht der Vorprozessor 130 keinen
eigenen Zähler
zu speichern, wie den Zähler 400,
und diesen Zähler
zu erhöhen,
um den nativen Befehl anzuzeigen, von dem erwartet wird, dass als
nächster
gelesen wird. Wenn der Prozessor eine Wiederzuführung anfordert, setzt der
Prozessor 112 automatisch den Befehlszeiger auf einen vorhergehenden
Wert. Auf diese Weise kann auch automatisch für Wiederzuführung gesorgt werden. 5 zeigt eine Struktur des
Befehlsszeigers 500 des Prozessors 112, wobei
der niedrigstwertige Teil 510, ausgehend vom niedrigstwertigen
Bit (LSB) für
den Übersetzungstabellenoffsetindikator
verwendet wird. Der Vorprozessor 130 umfasst Mittel 540,
um den Übersetzungstabellenoffsetindikator 510 aus
dem Befehlszeiger 500 zu extrahieren (dies kann selbst
eine XOR-Operation am Befehlszeiger 500 mit einer zuvor
be stimmten Bitmaske mit "1"-Bits bei der Position
des Teils 510 und "0"-Bits für den (die)
anderen Teile) beinhalten). Der extrahierte Teil kann direkt als
Zeiger in die Übersetzungstabelle
oder als Offset verwendet werden.
-
Bei einer weiteren Ausführungsform
umfasst ein zuvor bestimmter weiterer Teil 520 des Befehlsszeigers 500 einen
virtuellen Maschinenbefehlszeiger, der einen virtuellen Maschinenbefehl
in dem Befehlsspeicher 120 anzeigt. Dieser virtuelle Maschinenbefehlszeiger 520 kann
als virtueller Maschinenprogrammzähler betrachtet werden, der
jedes Mal, wenn ein neuer virtueller Maschinenbefehl erforderlich
ist, erhöht
werden muss. Wenn der Vorprozessor 130 ein speicherabgebildetes
Peripheriegerät
ist, werden eines oder mehrere der höchstwertigen Bits des Befehlsszeigers 500 zum
Anzeigen des für
den Vorprozessor 130 reservierten Adressenbereiches reserviert.
Im Prinzip können
die verbleibenden Bits für
den Teil 520 verwendet werden. Vorzugsweise ist dieser
Teil zumindest 16 Bit breit, was 64 KB-Blöcke virtuelles Maschinenprogramm
berücksichtigt.
Auch der Registerstapelzeiger 138 von 1A kann im Befehlszeiger codiert werden,
wodurch die Notwendigkeit, dass der Vorprozessor 130 diesen
Zeiger beibehält,
beseitigt wird.
-
Der Vorprozessor 130 umfasst
Mittel 530 zum Extrahieren des virtuellen Maschinenbefehlszeigers 520 aus
dem Befehlszeiger 500. Der Vorprozessor 130 ruft
den vom extrahierten virtuellen Maschinenbefehlszeiger angezeigten
virtuellen Maschinenbefehl aus dem Befehlsspeicher 120 ab.
Anhand des abgerufenen virtuellen Maschinenbefehls lokalisiert der
Vorprozessor 130 die Übersetzungstabelle.
Der niedrigstwertige Teil 510 des Befehlsszeigers 500 des
Prozessors wird dann als Offset in der Übersetzungstabelle verwendet.
Mittel 540 werden zum Extrahieren des niedrigstwertigen
Teils 510 aus dem Befehlszeiger 500 verwendet.
Vorzugsweise werden die Übersetzungstabellen
für die
jeweiligen virtuellen Maschinenbefehle zu einer einzigen sequentiellen
Tabelle kombiniert, wobei eine Zelle für native Befehle reserviert
ist, die einem einzigen virtuellen Maschinenbefehl entsprechen.
Eine solche Tabelle ist vorstehend beschrieben worden und in 2 ist auch ein Beispiel 200 gezeigt
worden. Zum Lokalisieren des relevanten Teil der Übersetzungstabelle 200 für jeden
virtuellen Maschinenbefehl kann, wie bereits beschrieben, eine Indextabelle 210 verwendet
werden. Zum Addieren der Ausgabe der Indextabelle 200 (d.
h. eine Zellenadresse der Übersetzungstabelle 200)
zum Übersetzungstabellenoffset
(Ausgabe der Extraktionsmittel 540) können Addiermittel 560 verwendet
werden. Vorteilhafterweise umfasst der Vorprozessor 130 einen
Cache 550 zum Speichern bereits aus dem Befehlsspeicher 120 abgerufener
oder abgerufen zu werden erwarteter virtueller Maschinenbefehle. Immer,
wenn eine Sequenz aus nativen Befehlen, die zu einem einzigen virtuellen
Maschinenbefehl gehört,
abgeschlossen worden ist, kann der virtuelle Maschinenbefehlszeiger
gesetzt werden, um den nächsten
virtuellen Maschinenbefehl anzuzeigen, beispielsweise unter Verwendung
eines letzten nativen Befehls in der Sequenz einen expliziten Sprung,
der den virtuellen Maschinenbefehlszeiger auf den Sollwert setzt
und den Übersetzungsoffsetteil
des Befehlsszeigers zurücksetzt.
Vorteilhafterweise ist, im Vergleich zu Teil 510, der Teil 520 des
Befehlsszeigers hinsichtlich der Wertigkeit der nächste höhere Teil.
Auf diese Weise kann der virtuelle Maschinenbefehlszeiger auch erhöht werden,
indem einer oder mehrere NOP-Befehle (NOP: no operation, Nulloperation)
verwendet werden, sodass schließlich
ein Überlauf
des Übersetzungsoffsetteils 510 dazu
führt,
dass der Prozessor 112 den virtuellen Maschinenbefehlszeiger
erhöht.
Je nach dem Prozessor kann es schneller sein, einen oder mehrere
NOP-Befehle auszuführen
als einen Sprung. Es versteht sich, dass es nicht erforderlich ist,
dass jede Anforderung aus dem Prozessor 112 für einen
nativen Befehl dazu führt,
das der Vorprozessor 130 einen virtuellen Maschinenbefehl
aus dem Befehlsspeicher 120 abruft.
-
Bei einer alternativen, in
6 gezeigten Ausführungsform
ist die Übersetzungstabelle
600 in
mehrere Subtabellen unterteilt; gezeigt werden Subtabellen
602,
604,
606,
608,
und
609. Jede Subtabelle umfasst zumindest einen nativen
Befehl oder ein natives Befehlsgerippe, wobei zumindest eine der
Subtabellen eine Sequenz aus nativen Befehlen oder nativen Befehlsgerippen
umfasst. Vorteilhafterweise beginnt eine Sequenz aus nativen Befehlen
für einen
virtuellen Maschinenbefehl beim ersten Eintrag einer Subtabelle.
Die Subtabelle kann, aber muss nicht, einer vollständigen Sequenz
aus nativen Befehlen entsprechen, die einem einzigen virtuellen
Maschinenbefehl entsprechen. Die Subtabelle kann kürzer sein
als die Sequenz, wobei dann vorgezogen wird, dass die Sequenz sich
in der sequentiell nächsten
Subtabelle fortsetzt. In der Praxis kann vorgezogen werden, eine
Subtabellengröße mit nur
4 oder 8 nativen Befehlen zu wählen,
was weniger sein kann als die maximale Sequenz aus nativen Befehlen
für einen
virtuellen Maschinenbefehl. Der Übersetzungstabellenoffsetindikator
510 zeigt
einen Offset in einer der Subtabellen an. Ein zuvor bestimmter weiterer
Teil
620 des Befehlsszeigers
500 umfasst einen
Subtabellenindikator. Der Vorprozessor
130 nutzt den Wert
des Subtabellenindikators
620, um die tatsächlich beteiligte
Subtabelle zu lokalisieren. Hierzu umfasst der Vorprozessor
130 Mittel
610 zum
Extrahieren des Subtabellenindikators
620 aus dem Befehlszeiger
500.
Vorzugsweise wird im Normalbetrieb der Subtabellenindikator jedes
Mal, wenn ein nativer Befehl aus einer nächsten Subtabelle abgerufen
wird, um eine Einheit erhöht
(unabhängig
davon, ob die Subtabelle sich auf den gleichen oder unterschiedliche
virtuelle Maschinenbefehle bezieht). Als Beispiel sei angenommen,
dass die Sequenz aus einem ersten virtuellen Maschinenbefehl in
den aufeinander folgenden Subtabellen mit jeweiligen Subtabellennummern
110,
111,
und
112 gespeichert ist; dass der nächste virtuelle Maschinenbefehl
in Subtabellen
85 und
86 gespeichert ist und dass
ein dritter virtueller Maschinenbefehl in Subtabellen
41 und
42 gespeichert
ist. Wenn die Subtabellengröße
4 Einträge beträgt (bei
Verwendung eines 2-Bit-Übersetzungstabellenoffsetindikators
510),
kann die erste Serie aus vier nativen Befehlen (der Subtabelle mit
Nummer
110) beispielsweise für den Subtabellenindikator
620 durch
einen Wert von 1 angezeigt werden, wobei die Übersetzungstabellenoffsetindikatoren
von 0 bis 3 laufen. Die zweite Serie aus vier nativen Befehlen (der
Subtabelle mit Nummer
111) wird dann durch einen Wert des
Subtabellenindikators
620 von 2 angezeigt werden. Die dritte
Serie wird durch einen Wert des Subtabellenindikators
620 von
3 angezeigt werden. Die vierte Serie (wenngleich sie sich auf einen
anderen virtuellen Maschinenbefehl bezieht) wird durch den nächsten Wert
des Subtabellenindikators
620 angezeigt werden, nämlich 4.
Vorteilhafterweise umfasst der Vorprozessor
130 einen Cache
630 zum
Speichern von Zeigern zu der (den) zugehörigen Subtabelle(n) für die zuletzt
verwendeten Subtabellenindikatoren. In diesem Beispiel würde der
Cache Folgendes speichern:
| Subtabellenindikator | Subtabellennummer |
| 1 | 110 |
| 2 | 111 |
| 3 | 112 |
| 4 | 85 |
-
Vorzugsweise haben die Subtabellen
gleiche Größe. Wenn
das so ist, kann ein Befehl für
die Wiederzuführung,
auf Basis des Subtabellenindikators 620, durch Lokalisieren
der Subtabellennummer im Cache 630, Multiplizieren der
Subtabellenummer mit der Größe und Addieren
des Übersetzungstabellenoffset 510 lokalisiert
werden. Vorteilhafterweise haben die Subtabellen gleiche Größe, die
eine Potenz von 2 ist. Durch Verwendung eines Übersetzungstabellenoffsetindikators 510 mit
entsprechender Länge
(ein k-Bit-Indikator entspricht einer Subtabellengröße von 2k) wird der Subtabellenindikator jedes Mall,
wenn alle Befehle einer Subtabelle behandelt worden sind, automatisch
erhöht
(als Ergebnis eines Überlaufs
des Übersetzungstabellenoffsetindikators 510).
Am Ende einer Sequenz aus nati ven Befehlen für einen einzigen virtuellen
Maschinenbefehl können
(kann ein) zusätzlicher)
NOP-Befehle) verwendet werden, um die Sequenz zu ergänzen, so dass
sie an einer Grenze der Subtabelle endet. Auf diese Weise wird der
Subtabellenindikator 620 für aufeinander folgende Sequenzen
von Befehlen auch automatisch auf einen korrekten Wert erhöht. Alternativ
kann ein Sprungbefehl verwendet werden, der den Übersetzungstabellenoffsetindikator 510 zurücksetzt
und den Subtabellenindikator 620 erhöht. Für Subtabellen variabler Größe kann
eine separate Indextabelle, ähnlich
Tabelle 210, zum Lokalisieren der Anfangsadresse einer
auf der Subtabellennummer beruhenden Subtabelle verwendet werden.
In der Praxis kann es möglich
sein, einen sehr kleinen Subtabellenindikator 620 zu verwenden.
Für einen
Prozessor, der Wiederzuführung
von bis zu 16 Befehlen anfordert und bei Verwendung von Subtabellen
mit 4 Einträgen
genügt
es, einen 2-Bit-Subtabellenindikator 620 zu verwenden.
In diesem Beispiel braucht der Cache 630 nur 4 Einträge zu haben.
-
Es versteht sich, dass für den Subtabellenindikator 620 auch
die tatsächliche
Subtabellennummer verwendet werden kann. In diesem Fall sind jedoch
Sprünge
erforderlich, um den Subtabellenindikator 620 auf den korrekten
Wert zu setzen, beispielsweise wenn eine andere Sequenz begonnen
wird. Auch die Größe des Subtabellenindikators 620 wird
größer sein
müssen,
um alle Subtabellennummern darstellen zu können. Bei Verwendung einer
solchen Anordnung kann die Kombination des Subtabellenindikators 620 und
des Übersetzungstabellenoffsetindikators 510 direkt
einen Eintrag in der Tabelle 600 anzeigen, wodurch der
Cache 630 redundant wird.
-
Bei einer weiteren Ausführungsform
gemäß der Erfindung
umfasst der Mikrocontroller 110 den Befehlsspeicher 120 und
den Vorprozessor 130. Hierbei sind der Prozessor 112,
der Befehlsspeicher 120 und der Vorprozessor 130 über einen
Mikrocontrollerbus 140 für atomare Transaktion gekoppelt.
Mit einem Mikrocontrollerbus für
atomare Transaktion ist ein Bus gemeint, auf dem eine Einrichtung
zum Ausführen
einer Lese-Operation,
wie z. B. Abrufen eines Befehls, die folgende Sequenz aus Schritten
ausführt:
- – die
Einrichtung erhält
ausschließlichen
Zugriff auf den Bus,
- – die
Einrichtung fordert Daten an (wie z. B. einen Befehl), indem eine
Anforderung auf den Bus gegeben wird,
- – die
Einrichtung erhält
die Daten, wenn eine andere Einrichtung die Daten auf den Bus gegeben
hat,
- – die
Einrichtung gibt den Bus frei, was anderen Einrichtungen den Zugriff
auf den Bus ermöglicht.
-
Der Prozessor 112 fordert
(erneutes) Zuführen
von nativen Befehlen über
den Bus 140 an. Der Vorprozessor 130 ruft auch über den
Bus 140 aus dem Befehlsspeicher 120 virtuelle
Maschinenbefehle zur Umsetzung in (einen) zugehörige(n) native(n) Befehle)
ab. Ohne spezielle Vorkehrungen kann eine Blockade auftreten, wenn
der Prozessor 112 einen nativen Befehl angefordert hat
und den Bus 140 blockiert, bis der Befehl abgegeben worden
ist, während
der Vorprozessor 130 zuerst einen (virtuellen Maschinen-)
Befehl aus dem Befehlsspeicher 120 über den gleichen Bus 140 erhalten
muss, bevor er den nativen Befehl abgegeben kann. Um eine solche
Situation zu vermeiden, umfasst der Vorprozessor 130 Mittel,
um, in Reaktion darauf, dass der Prozessor 112 (erneutes)
Zuführen
eines nativen Befehls anfordert, dessen zugehöriger virtueller Maschinenbefehl
nicht oder nicht mehr im Vorprozessor 130 vorliegt, einen
Nulloperationsbefehl (NOP-Befehl) dem Prozessor 112 zuzuführen, wodurch
die von dem Prozessor 112 initiierte Bustransaktion abgeschlossen
wird.
-
Vorteilhafterweise ist die Verarbeitungseinrichtung 100 imstande,
virtuelle Maschinenbefehle von mehr als einem Programm auszuführen. Die
Verarbeitungseinrichtung 100 unterstützt beispielsweise eine Vielzahl
von Aufgaben, die in virtuellen Maschinenbefehlen ausgedrückt werden.
Optional können
einige der Aufgaben auch in nativen Befehlen ausgedrückt werden.
Vorzugsweise ist die Unterstützung
für Mehrfachaufgaben
für virtuelle
Maschinen durch eine Aufgabeumschaltroutine in dem auf dem Mikrocontroller 110 laufenden
Betriebssystem implementiert. Wenn eine Aufgabenumschaltung ausgelöst wird
(z. B. angesteuert durch eine Timerunterbrechung und abgehandelt
durch eine Aufgabenumschalt-Unterbrechungshandlungsroutine), wird
Information, die für
die derzeit aktive Aufgabe relevant ist, zusätzlich zum Sichern von Information
aus dem Prozessor 112 vom Vorprozessor 130 aus
gesichert. Die Information kann in einem Speicher gesichert werden.
Die gleiche Art der Information wird für die neue Aufgabe erneut geladen
und dem Vorprozessor 130 und dem Prozessor 112 zur
Verfügung
gestellt. Bei den in 3 und 4 gezeigten Ausführungsformen
enthält die
relevante Vorprozessorinformation den Inhalt des Zuführspeichers 300,
den Zähler 400 und
den Zeiger 430. Bei den in 5 und 6 gezeigten Ausführungsformen
enthält
die betreffende Vorprozessorinformation den Inhalt des Cache 550 bzw. 630.
Um Sichern und Rückspeichern
der Information zu ermöglichen,
sind die betreffenden Elemente des Vorprozessors 130 von
einer Art, die unter Steuerung des Pro zessors 112 gelesen und
gesetzt werden kann. Es versteht sich, dass als Alternative der
Cache 550 vom Vorprozessor 130 gesichert und rückgespeichert
werden kann.
-
Inschrift der Zeichnung
-
4
-
- NEW NEU
- select selektieren
- OUT AUS