-
Die Erfindung betrifft die Programmierung von
Mikrocontrollern und die Fehlerkorrektur von Programmcode für Mikrocontroller.
Insbesondere ist die Erfindung für
Mikrocontroller von tragbaren Datenträgern, wie beispielsweise Chipkarten
(smart cards) in unterschiedlichen Bauformen oder Chipmodulen, vorgesehen.
-
Tragbare Datenträger, wie sie gegenwärtig üblich sind,
weisen einen Mikrocontroller mit einem Prozessorkern und mehreren
unterschiedlichen Speicherfeldern auf. In einer typischen Konfiguration sind
als Speicherfelder beispielsweise ein maskenprogrammiertes ROM,
ein elektrisch lösch-
und programmierbares EEPROM und ein beschreibbares RAM vorgesehen.
Das vom Prozessorkern auszuführende
Programm wird in der Regel im ROM abgelegt, weil dieser Speicher
das beste Verhältnis
zwischen bereitgestelltem Speicherplatz und benötigter Chipfläche aufweist.
Allerdings muß der
Inhalt des ROM schon bei der Herstellung des Mikrocontrollers festgelegt
werden. Wird nachträglich
ein Fehler in dem im ROM enthaltenen Programm entdeckt, so entsteht
hoher Schaden, weil neue Masken und neue Mikrocontroller gefertigt
werden müssen.
-
Abschnitt 5.4 des Buches "Handbuch
der Chipkarten" von W. Rankl und W. Effing, Hanser Verlag, 3. Auflage
1999, Seiten 216 – 217,
erläutert
eine Technik, um Korrekturmöglichkeiten
für Programmierfehler
zu schaffen. Es werden dazu in dem im ROM enthaltenen Programmcode
Aussprungbefehle zu einer im EEPROM gespeicherten Verknüpfungstabelle
vorgesehen. Die Verknüpfungstabelle
wird beim Komplettieren des Datentäger-Betriebssystems in das
EEPROM geladen. Weist der Programmcode im ROM keine Fehler auf,
so enthält
die Verknüpfungstabelle
lediglich Rücksprungbefehle
an die dem jeweiligen Aussprungbefehl unmittelbar folgende ROM-Adresse.
-
Ist dagegen ein Programmabschnitt
fehlerhaft, so wird dieser im EEPROM durch entsprechend korrigierten
Programmcode – eine
sogenannte Patchroutine – ersetzt.
-
Aus der gerade genannten Beschreibung des
Buches "Handbuch der Chipkarten" ergibt sich jedoch kein Hinweis
darauf, wie die benötigte
Aufteilung des Programmcodes bestimmt wird und wie die Verknüpfungstabelle
erzeugt wird. Auch besteht das generelle Problem, daß einerseits
genügend,
aber andererseits nicht unnötig
viele Aussprungpunkte vorgesehen sein sollen. Ferner ist es wünschenswert,
die Aussprungpunkte an für
das Anbinden von Patchroutinen möglichst
gut geeigneten Stellen einzufügen.
-
Aus den US-Patenten 4,905,200, 5,357,627 und
5,454,100 sind Mikroprozessoren mit hardwarebasierten Patchmechanismen
bekannt. Mikroprozessoren mit derartigen Patchmechanismen, die überdies
die zum Einsatz bei tragbaren Datenträgern erforderlichen Eigenschaften
aufweisen, sind jedoch gegenwärtig
nicht kommerziell verfügbar.
-
Die Erfindung hat die Aufgabe, die
Probleme des Standes der Technik zumindest zum Teil zu vermeiden
und eine Möglichkeit
zum Anbinden von Patchroutinen an Programmcode für einen Mikrocontroller zu
schaffen, die die Programmierarbeit erleichtert und dadurch zu besseren
Ergebnissen führt
und/oder geringeren Aufwand erfordert. Aufgabe einer bevorzugten
Ausführungsform
der Erfindung ist es überdies,
eine Möglichkeit
zum Anbinden von Patchroutinen an besonders günstige Stellen des Programmcodes
zu schaffen.
-
Erfindungsgemäß wird diese Aufgabe ganz oder
zum Teil gelöst
durch Verfahren mit den Merkmalen des Anspruchs 1 bzw. des Anspruchs
9, ein Computerprogrammprodukt gemäß Anspruch 10 und einen tragbaren
Datenträger
gemäß Anspruch
11. Die abhängigen
Ansprüche
definieren bevorzugte Ausgestaltungen der Erfindung.
-
Die Aufzählungsreihenfolge der Schritte
in den Verfahrensansprüchen
soll nicht als Einschränkung
des Schutzbereichs verstanden werden. Es sind vielmehr Ausgestaltungen
der Erfindung vorgesehen, in denen diese Schritte in anderer Reihenfolge
oder ganz oder teilweise parallel oder ganz oder teilweise ineinander
verzahnt (interleaved) ausgeführt
werden. In der hier verwendeten Wortwahl soll der Begriff "Programmcode"
sowohl ausführbaren Maschinencode
vor oder nach dem Binden als auch den entsprechenden Assembler-Quellcode
bezeichnen.
-
Die Erfindung geht von der Grundidee
aus, einen geeignet modifizierten Compiler einzusetzen, der in den
erzeugten Programmcode – zusätzlich zu den
für die
Ausführung
der Konstrukte des Quelltexts erforderlichen Programmbefehlen – mindestens
einen Aussprungbefehl einfügt.
Durch den Aussprungbefehl läßt sich
später,
falls erforderlich, eine Patchroutine an den Programmcode anbinden.
Die erfindungsgemäße Technik
entlastet somit den Programmentwickler, weil er oder sie nicht mehr
manuell Anbindestellen für
mögliche
Patchroutinen einprogrammieren muß. In Versuchen hat sich gezeigt,
daß diese
Vereinfachung zu einer erheblich höheren Qualität des fertigen
Programmcodes führt.
Insbesondere wird die Wahrscheinlichkeit, daß eine später erforderliche Anbindestelle
vergessen oder aufgrund des Arbeitsaufwands weggelassen wird, erheblich
verringert.
-
Die Erfindung ist vorzugsweise für die Compilierung
von Quelltext höherer
Programmiersprachen, wie z.B. der Sprache C, vorgesehen. In diesem Zusammenhang
ist die erfindungsgemäße Technik besonders überraschend, weil
in höheren
Programmiersprachen normalerweise keine Rücksicht auf das später möglicherweise
erforderliche Einbinden von Patchroutinen genommen wird. Die Konstrukte, bei
deren Übersetzung
zusätzliche
Aussprungbefehle eingefügt
werden, können
beispielsweise Anweisungen und/oder Funktionsdeklarationen sein.
-
In einer besonders bevorzugten Ausgestaltung
der Erfindung wird bei der Übersetzung
zumindest mancher Konstrukte der zusätzliche Aussprungbefehl in
der Ausführungsreihenfolge
zwischen diejenigen Programmbefehle eingefügt, die für die eigentliche Ausführung des
Konstrukts benötigt
werden. Wenn beispielsweise das zu übersetzende Konstrukt ein Funktionsaufruf
ist, kann vorzugsweise der Aussprungbefehl in der Ausführungsreihenfolge
nach den zur Parameterübergabe
dienenden Programmbefehlen, aber vor den eigentlichen Sprungbefehl
zur aufgerufenen Funktion eingefügt
werden. Wenn in diesem Zusammenhang von "vor" und "nach" die Rede
ist, so ist darunter in manchen Ausgestaltungen "unmittelbar vor"
bzw. "unmittelbar nach" zu verstehen. Allgemein können aber
zwischen den genannten Befehlen weitere Befehle vorhanden sein,
insbesondere ein Identifikationsbefehl zur Kennzeichnung des jeweiligen
Aussprungpunktes.
-
Die im vorhergehenden Absatz beschriebene
Ausgestaltung ist besonders vorteilhaft, weil sie Programmstrukturen
ermöglicht,
die durch eine Programmierung auf der Ebene des Quelltexts nicht
erzielbar wären.
So ist die gerade beispielhaft genannte Anbindestelle nach der Parameterübergabe,
aber vor dem Sprungbefehl zu einer aufgerufenen Funktion besonders
gut geeignet, um eine fehlerhafte Parameterversorgung (falsche oder
unvollständige
Parameter der aufgerufenen Funktion) durch eine geeignete Patchroutine
zu korrigieren.
-
Vorzugsweise wird das Einfügen der
Aussprungbefehle durch entsprechende Compiler-Direktiven (pragmas)
im Quelltext gesteuert oder zumindest beeinflußt. Derartige Compiler-Direktiven
werden in der Wortwahl des vorliegenden Dokuments nicht als Konstrukte
der Programmiersprache des Quelltexts angesehen. Beispielsweise
kann vorgesehen sein, daß für jeden
eingefügten
Aussprungbefehl eine eigene Compiler-Direktive angegeben werden muß, oder
es kann eine einzige Compiler-Direktive – z.B. in Zusammenhang mit
einer Funktionsdeklaration – bestimmen,
daß in
jeden Aufruf dieser Funktion ein Aussprungpunkt eingefügt wird.
In weiteren Ausgestaltungen fügt
der Compiler selbsttätig – unter Verwendung
vorgegebener Heuristiken – Aussprungpunkte
in den erzeugten Programmcode ein.
-
Bevorzugt ist vorgesehen, den erzeugten Programmcode
in ein erstes Speicherfeld des Mikrocontrollers einzuprogrammieren,
wobei das erste Speicherfeld z.B. maskenprogrammierbar sein kann. Ein
zweites Speicherfeld, das z.B. elektrisch programmierbar sein kann,
dient vorzugsweise zur Aufnahme der erforderlichen Patchroutinen.
Ferner kann in dem zweiten Speicherfeld ein Verteiler vorgesehen sein,
der die Einbindung der einzelnen Patchroutinen in der Programmablauf übernimmt.
-
In einer bevorzugten Ausgestaltung
ist der Verteiler als Verknüpfungstabelle
mit einer Mehrzahl von Steueranweisungen ausgestaltet. Vorzugsweise gibt
jede Steueranweisung an, ob für
den entsprechenden Aussprungpunkt eine Patchroutine vorhanden ist.
Beispielsweise können
die Steueranweisungen als Sprungbefehle ausgestaltet sein, die eine
im Programmfluß unmittelbar
oder mit Abstand folgende Adresse im ersten Speicherfeld – beziehungsweise, wenn
eine Patchroutine vorgesehen ist, die Startadresse dieser Patchroutine – als Sprungziel
aufweisen.
-
In weiteren Ausgestaltungen ist der
Verteiler als Patchauswahlroutine ausgestaltet, zu der die Aussprungbefehle
verzweigen. Die Patchauswahlroutine führt ihrerseits entweder eine
entsprechende Patchroutine aus oder setzt, wenn keine Patchroutine
vorhanden ist, die Programmausführung
gemäß dem ursprünglich vorgesehenen
Ablauf fort. Die einzelnen Patchroutinen können in die Patchauswahlroutine
integriert sein oder vor letzterer angesprungen werden. In unterschiedlichen
Ausgestaltungen enthält
die Patchauswahlroutine Informationen – z.B. Indexnummern oder Identifikatoren – über die
vorhandenen Patchroutinen. Die Patchauswahlroutine kann auch im
ersten Speicherbereich enthalten sein und auf derartige Informationen,
die im zweiten Speicherbereich vorliegen, zugreifen.
-
Das erfindungsgemäß vorgesehene Computerprogrammprodukt
kann beispielsweise ein magnetischer oder optischer Datenträger oder
ein elektrisches oder optisches Signal sein. Das Computerprogrammprodukt
enthält
Programmcode, der die erfindungsgemäßen Schritte ausführt. Vorzugsweise
enthält
das Computerprogrammprodukt ferner einen Compiler und/oder einen
Assembler und/oder ein Bindeprogramm und/oder ein Ladeprogramm.
-
Das erfindungsgemäße Computerprogrammprodukt
und der erfindungsgemäße tragbare Datenträger sind
bevorzugt mit Merkmalen weitergebildet, die den oben beschriebenen
und/oder in den Verfahrensansprüchen
genannten Merkmalen entsprechen. Vorzugsweise enthält der Datenträger mindestens
eine Patchroutine und mindestens eine Steueranweisung, die für die Anbindung
der Patchroutine an den Programmcode sorgt.
-
Weitere Merkmale, Aufgaben und Vorteile der
Erfindung gehen aus der folgenden Beschreibung eines Ausführungsbeispiels
und mehrerer Ausfüh rungsalternativen
hervor. Es wird auf die Zeichnungen verwiesen, in denen zeigen:
-
1 eine
schematische Darstellung eines tragbaren Datenträgers sowie unterschiedlicher
Dateien beim Compilierungs- und Ladevorgang in einem Ausführungsbeispiel
der Erfindung,
-
2 eine
beispielhafte Darstellung von Teilen eines Quelltexts, eines Programmcodes
und eines Verteilers in dem Ausführungsbeispiel
von 1, und
-
3 eine
Darstellung wie in 2 in
einer Ausführungsalternative.
-
Die Erfindung wird bei der Programmierung eines
tragbaren Datenträgers 10 eingesetzt,
der im hier beschriebenen Ausführungsbeispiel
als Chipkarte oder Chipmodul ausgestaltet ist. In an sich bekannter
Weise enthält
der Datenträger 10 einen
Mikrocontroller 12, der auf einem einzigen Halbleiterchip
einen Prozessorkern 14, drei Speicherfelder 16, 18, 20 und
eine Schnittstelle 22 zur kontaktlosen oder kontaktgebundenen
Kommunikation aufweist. Die genannten Komponenten sind über einen
Bus 24 miteinander verbunden. Im vorliegenden Ausführungsbeispiel
ist das erste Speicherfeld 16 als maskenprogrammierter
Festwertspeicher (ROM) ausgestaltet, das zweite Speicherfeld 18 als
elektrisch löschbarer und
beschreibbarer Festwertspeicher (EEPROM) und das dritte Speicherfeld 20 als
flüchtiger Schreib-/Lesespeicher
(RAM). In Ausführungsalternativen
können
die drei Speicherfelder 16, 18, 20 in anderen
Technologien ausgestaltet sein.
-
Das erste Speicherfeld 16 enthält Programmcode 26 für ein Betriebssystem
sowie für
ein oder mehrere Applikationsprogramme des Datenträgers 10.
Bei der Herstellung des Mikrocontrollers 12 wird eine dem
Programmcode 26 entsprechende Maske verwendet, um den Programmcode 26 unveränderlich
in Schaltungsstrukturen des ersten Speicherfeldes 16 einzubringen
(in 1 durch den gestrichelten
Pfeil 30 angedeutet). Um Fehler im Programmcode 26 korrigieren
und/oder neue Funktionalitäten
in den Programmcode 26 einbinden zu können, verzweigt die Programmausführung an
bestimmten Stellen des Programmcodes 26 zu einem Verteiler 28,
der hier als Verknüpfungstabelle
ausgestaltet ist und der sich im zweiten Speicherfeld 18 befindet.
Der Verteiler 28 und, falls erforderlich, eine oder mehrere
Patchroutinen 32, werden im Zuge der Komplettierung des
Betriebssystems oder im Zuge der Initialisierung des Datenträgers 10 in
das zweite Speicherfeld 18 eingeschrieben (in 1 durch den Pfeil 34 angedeutet).
Das dritte Speicherfeld 20 dient als Arbeitsspeicher während der
Programmausführung.
-
Ein Compiler 36 dient bei
der Entwicklung des Datenträgers 10 zum
Erzeugen des Programmcodes 26 aus einem Quelltext 38;
dieser Erzeugungsvorgang ist durch den dicken Pfeil 40 angedeutet.
Ferner generiert der Compiler 36 den ursprünglichen
Verteiler 28, der noch keine Patcheinträge aufweist (dicker Pfeil 42).
Der Compiler 36 des vorliegenden Ausführungsbeispiels basiert wesentlich
auf einem an sich bekannten Compiler, der jedoch gemäß der Erfindung
modifiziert wurde.
-
Der ausführbare Programmcode 26 liegt
im ersten Speicherfeld 16 in Form von maschinensprachlichen
Binärwörtern vor;
in 2 ist der Programmcode 26 dagegen
in Form von Assemblerbefehlen gezeigt. Die Schritte des Assemblierens und/oder
Bindens des Programmcodes 26 können in unterschiedlichen Ausführungsvarianten
entweder durch den Compiler 36 oder durch andere, in den
Figuren nicht dargestellte Werkzeuge vorgenommen werden. Im vorliegenden
Ausführungsbeispiel
beruht der Programmcode 26 auf dem 8051-Befehlssatz, während in
Ausführungsalternativen
andere Befehlssätze,
jeweils entsprechend dem Prozessorkern 14, vorgesehen sind.
-
Der Quelltext 38 ist in
einer höheren,
weitgehend hardwareunabhängigen
Programmiersprache verfaßt,
nämlich
im vorliegenden Ausführungsbeispiel
in der Programmiersprache C. In anderen Ausgestaltungen können andere
Programmiersprachen für
den Quelltext 38 vorgesehen sein. Ferner kann der Quelltext 38 auch
einzelne maschinennahe Abschnitte in Assemblersprache enthalten.
Der Quelltext 38 weist eine Vielzahl von Konstrukten der
höheren
Programmiersprache auf. In 2 sind
davon beispielhaft Funktionsdeklarationen 44A, 44B,
Variablendeklarationen 46A, 46B, Funktionsrücksprünge 48A, 48B und
Anweisungen (statements) 50A – 50D gezeigt. Insbesondere
im Hinblick auf die Anweisungen 50A – 50D ermöglicht die
verwendete Programmiersprache eine große Vielfalt; so sind beispielsweise
die Anweisungen 50A – 50C als
Zuweisungen (assignments) und die Anweisung 50D als Funktionsaufruf
ausgestaltet.
-
Der Compiler 36 übersetzt
jedes genannte Konstrukt des Quelltexts 38 in einen entsprechenden Abschnitt
des Programmcodes 26, wobei jeder solche Abschnitt keinen,
einen oder mehrere Programmbefehle 52A – 52H aufweisen kann.
Die Beziehung der Quelltext-Konstrukte zu den Abschnitten des Programmcodes 26 ist
in 2 durch gestrichelte
horizontale Linien dargestellt. Beispielsweise wurde für die Anweisung 50A ein
Programmbefehl 52A erzeugt, und für die Anweisung 50B wurden
zwei Programmbefehle 52B, 52C erzeugt. In der
in 2 gezeigten Assemblerdarstellung
des Programmcodes 26 sind ferner Marken (labels) 54A – 54C enthalten.
Weitere Elemente der Assemblerdarstellung des Programmcodes 26,
wie z.B. Deklarationen für symbolische
Adressen und für
Konstanten, sind in 2 der Übersichtlichkeit
halber nicht gezeigt.
-
Die erfindungsgemäße Funktion des Compilers 36 zeigt
sich bei der Übersetzung
der als Funktionsaufruf ausgestalteten Anweisung 50D in
die drei Programmbefehle 52F – 52H und einen zusätzlichen Aussprungbefehl 56.
Um den Funktionsaufruf auszuführen,
wären nur
die drei Programmbefehle 52F – 52H erforderlich.
Die beiden erstgenannten Programmbefehle 52F, 52G dienen
zur Parameterübergabe,
die im vorliegenden Ausführungsbeispiel über die
Register R0, R1,... des Mikrocontrollers 12 erfolgt;
in Ausführungsalternativen
werden die zu übergebenden
Parameter in einen Stapelspeicher des Mikrocontrollers 12 geschrieben.
Der dritte Programmbefehl 52H stellt den eigentlichen Funktionsaufruf dar,
nämlich
den Sprung zur Marke 54A als Einsprungstelle der Funktion
"swap".
-
Zwischen die Programmbefehle 52F, 52G einerseits
und 52H andererseits hat der Compiler 36 beim Übersetzungsvorgang 40 den
Aussprungbefehl 56 als zusätzlichen Programmbefehl eingefügt. Der Aussprungbefehl 56 verzweigt
im vorliegenden Ausführungsbeispiel
unmittelbar zu einer Steueranweisung 58 in dem als Verknüpfungstabelle
ausgebildeten Verteiler 28. In dem in
-
2 dargestellten
Beispiel ist die Steueranweisung 58 ein Sprungbefehl, der
auf die dem Aussprungbefehl 56 unmittelbar folgende Adresse
(Marke 54C) verweist. In der Reihenfolge der Programmausführung werden
also die Programmbefehle 52F, 52G, dann der Aussprungbefehl 56,
dann die Steueranweisung 58 und dann die Programmbefehle 52H, 52A, 52B,...
abgearbeitet.
-
In einer optimierten Ausgestaltung
des Einfügens
eines Aussprungbefehls 56 in einen Funktionsaufruf wird
der Sprungbefehl 52H unmittelbar als Steueranweisung 58 verwendet.
Durch diese Maßnahme
werden Speicherplatz und Rechenzeit eingespart. Die zur Ausführung der
Anweisung 50D erforderlichen Programmbefehle 52F, 52G, 52H sind dann
teils im Programmcode 26 und teils – in Form des Programmbefehls 52H als
Steueranweisung 58 – im
Verteiler 28 enthalten.
-
Das in 2 gezeigte
Beispiel stellt die Situation während
der Entwicklung des Programmcodes 26 dar, bei der noch
kein Programmfehler bekannt ist und demzufolge keine Patchroutinen 32 eingebunden
werden müssen.
Wenn sich zu einem späteren Zeitpunkt
herausstellt, daß die
bereits hergestellten Mikrocontroller 12 fehlerhaften Programmcode 26 im ersten
Speicherfeld 16 aufweisen, so wird zur Korrektur jedes
entdeckten Fehlers je eine geeignete Patchroutine 32 erstellt.
Im Verteiler 28 wird für
jeden Fehler diejenige Steueranweisung 58, die im Programmablauf
möglichst
kurz vor der Fehlerstelle in Reaktion auf den entsprechenden Aussprungbefehl 56 angesprochen
wird, durch einen Sprung zu der entsprechenden Patchroutine 32 ersetzt.
-
Der geänderte Verteiler 28 und
alle Patchroutinen 32 werden beim Komplettieren oder Initialisieren
des Datenträgers 10 in
das zweite Speicherfeld 18 geladen. Die Programmausführung erfolgt nun
von den Programmbefehlen 52F, 52G zum Aussprungbefehl 56,
dann zum geänderten
Sprungbefehl in der Steueranweisung 58 und von dort zur
Patchroutine 32. Die Patchroutine 32 führt die
korrekte Funktion aus und springt dann an einen geeigneten Rücksprungpunkt
im Programmcode 26.
-
Im Beispiel von 2, bei dem der Aussprungbefehl 56 vom
Compiler 36 nach den Befehlen 52F, 52G zur Parameterübergabe
bei einem Funktionsaufruf, aber vor den eigentlichen Sprungbefehl 52H;
eingefügt
wurde, eignet sich der hier beschriebene Patchmechanismus besonders
gut, um fehlerhafte und unvollständige
Funktionsparameter richtigzustellen. Nach der Korrektur der übergebenen
Parameter durch die Patchroutine 32 kann die ur sprüngliche
Funktion – hier
z.B. die Funktion "swap" – mit
den gewollten Parametern in den Registern R0, R1,... ausgeführt werden.
Ferner ist aus dem Beispiel von 2 ersichtlich,
daß der
Compiler 36 den Aussprungbefehl 56 nicht an den
Grenzen des Programmcode-Abschnitts, der zur Ausführung der
Anweisung 50D erforderlich ist, erzeugt hat. Die hier gezeigte
Anordnung hätte
sich daher durch eine manuelle Programmierung eines Aussprungpunkts
im Quelltext 38 nicht erzielen lassen.
-
Um das Einfügen des Aussprungbefehls 56 durch
den Compiler 36 zu steuern, ist im vorliegenden Ausführungsbeispiel
eine Compiler-Direktive (pragma) 60 vorgesehen. Diese Compiler-Direktive 60 ist
im Quelltext 38 unmittelbar vor der Deklaration 44A der
Funktion "swap" angeordnet. Im vorliegenden Ausführungsbeispiel hat dies die
Wirkung, daß der
Compiler 36 in jeden Aufruf der Funktion "swap" je einen
Aussprungbefehl 56 einfügt.
Auf diese Weise kann der Programmierer mit einer einzigen Compiler-Direktive 60 die
Einfügung
einer Vielzahl von Aussprungpunkten veranlassen. Dies verringert
das Risiko, daß ein
später
wünschenswerter
Aussprungpunkt vergessen wird, erheblich.
-
Da jeder Aussprungpunkt Rechenzeit
und Speicherplatz kostet, ist in Ausführungsalternativen vorgesehen,
daß in
Reaktion auf eine Compiler-Direktive 60 nur je ein einziger
Aussprungbefehl 56 eingefügt wird. In diesen Ausgestaltungen
ist die Compiler-Direktive 60 vorzugsweise unmittelbar
vor demjenigen Konstrukt, bei dessen Übersetzung der Aussprungbefeh156
eingefügt
werden soll, angeordnet. Ferner kann auch vorgesehen sein, daß der Compiler 36 an
besonders günstigen
Stellen automatisch Aussprungbefehle 56 in den erzeugten
Programmcode 26 einfügt.
-
Bei dem Ausführungsbeispiel von 2 ist für jeden Aussprungbefehl 56 je
ein eigener Eintrag in der Verknüpfungstabelle
vorgesehen. Mit anderen Worten erfolgt die Identifikation des Aussprungpunktes über das
Sprungziel des Aussprungbefehls 56. In der in 3 gezeigten alternativen
Ausgestaltung erzeugt der Compiler 36 dagegen einen leicht
veränderten
Programmcode 26' sowie einen Verteiler 28', der
als Patchauswahlroutine ausgestaltet ist. Die Patchauswahlroutine
weist einen einzigen Einsprungpunkt (Marke "phand") für alle Aussprungbefehle
(z.B. 56') des Programmcodes 26' auf. Zur Unterscheidung
der einzelnen Aussprungstellen sind die Aussprungbefehle (z.B. 56')
hier als Unterprogramm-Aufrufbefehle "lcall" ausgebildet. Der Rücksprung
zu der dem jeweiligen Aussprungbefehl (z.B. 56') folgenden
Adresse erfolgt über
einen gemeinsamen Unterprogramm-Rücksprungbefehl "ret", der hier
die Rolle einer Steueranweisung 58' übernimmt.
-
In der Ausgestaltung gemäß 3 hat der Compiler 36 in
den Programmcode 26' unmittelbar vor den Aussprungbefehl 56' einen
Identifikationsbefehl 62 eingefügt, mit dem ein Identifikator
"pid" des jeweiligen Aussprungpunktes in den Akkumulator geladen
wird. Mit anderen Worten dient der Identifikator "pid" als zusätzlicher
Parameter für
den als Patchauswahlroutine ausgestalteten Verteiler 28'.
Der Identifikator "pid" kann als Konstante oder Variable ausgestaltet
sein. Der Verteiler 28' vergleicht den Identifikator "pid"
sukzessive mit denjenigen Identifikatorwerten, für die eine Patchroutine 32 vorliegt.
Bei einer Übereinstimmung
wird die jeweilige Patchroutine 32 ausgeführt. Wenn
für den
Identifikator "pid" keine Patchroutine 32 gefunden wurde,
erfolgt der Rücksprung über den
Unterprogramm-Rücksprungbefehl
"ret" zum Programmcode 26'.
-
Im Ausführungsbeispiel von 3 ist der Verteiler 28' komplett
im zweiten Speicherfeld 18 abgelegt. In ihn sind alle Identifikatorwerte,
mit denen der Identifikator "pid" verglichen wird, sowie alle vorhandenen
Patchroutinen 32 integriert. In Ausführungsalternativen sind dagegen
im Verteiler 28' Sprungbefehle zu externen Patchroutinen 32 vorgesehen.
In weiteren Ausführungsvarianten
ist der Verteiler 28' als fixes Programm-Modul im ersten
Speicherfeld 16 enthalten. Der Verteiler 28' greift
dann auf entsprechende Verwaltungsdaten im zweiten Speicherfeld 18 zu.
Diese Verwaltungsdaten sind z.B. die Identifikatorwerte, mit denen
der Identifikator "pid" verglichen wird, und Adressen oder Indexnummern der
auszuführenden
Patchroutinen 32.
-
Es versteht sich, daß in weiteren
Ausführungsalternativen
auch der Aussprungbefehl 56 gemäß 2 als Unterprogramm-Aufrufbefehl "lcall" ausgebildet
sein kann. Die entsprechende Steueranweisung 58 ist dann
ein Unterprogramm-Rücksprungbefehl
"ret", sofern keine Patchroutine 32 vorliegt. Ferner kann
auch in der Ausgestaltung mit einer Verknüpfungstabelle gemäß 2 zusätzlich ein Identifikator "pid"
verwendet werden. Es sind auch weitere Ausgestaltungen der Erfindung
vorgesehen, die die einzelnen Merkmale gemäß 2 und 3 in
unterschiedlichen Kombinationen aufweisen.
-
Sowohl in der Ausgestaltung von 2 als auch in der von 3 kann als Aussprungbefehl 56, 56'
ein unterbrechungsauslösender
Befehl verwendet werden. Es ist auch möglich, vor einem "normalen"
Sprungbefehl "ljmp" als Aussprungbefehl 56, 56' zunächst die
gewünschte
Rücksprungadresse
in einen Stapelspeicher des Mikrocontrollers 12 zu schreiben.
Wenn z.B. im Stapelspeicher eine Rücksprungadresse vorliegt, kann
diese – alternativ
oder zusätzlich
zum Identifikator "pid" – im
Verteiler 28, 28' und/oder den Patchroutinen 32 ausgewertet
werden. Umgekehrt kann auch auf Grundlage des Identifikators "pid"
auf die passende Rücksprungadresse
geschlossen werden.