Die Embedded-Systems (ES) haben Einzug gehalten. Sei
es im Auto, im Organizer, im Handy etc, sie sind omni-present.
Nebst dieser Revolution in der Miniaturisierung der
Hardware hatten wir in den letzten zwei Dekaden ebenfalls
eine Revolution, oder viel mehr eine Evolution, in der
Software-Entwicklung zu verzeichnen: die objekt-orientierte
Technologie.
Hatte sich C hervorragend zur Programmierung von ES
geeignet, ist es mit C++ noch besser möglich, komplexe
Problem-Stellungen zu modellieren.
Typische ES besitzen in der Regel sehr wenig RAM, beispielsweise
20KB, aber ungleich mehr ROM, z.B. 1MB. So liegt es
nahe, möglichst viele Konfigurations-Daten ins
ROM zu legen. In der Zeit von C wahr dies auch problemlos
möglich. Durch Deklaration einer Variablen mit
den Modifiers static const wurde der Linker dazu angehalten,
diese Daten im Code-Segment abzulegen.
Mit C++ ist dies nicht mehr möglich, falls es
sich bei den Daten um polymorphe Objekte handelt, das
heisst, virtuelle Methoden vorhanden sind. Der Grund
dafür ist, dass der Konstruktor für polymorphe
Objekte zwingenderweise zur Laufzeit ausgeführt
werden muss, dies im ROM aber nicht möglich ist.
Trotzdem wäre es wünschenswert, sämtliche
Konfigurationen im ROM ablegen zu können. Man führe
sich nur einmal die verschiedenen Modelle eines Mobiltelefonherstellers
vor Augen. Die Grundfunktionalität ist bei allen
Geräten gleich, sie unterscheiden sich jedoch Beispielsweise
in der Menüführung. Das Festlegen der Konfiguration,
also der Menüführung, sollte möglich
sein, ohne die Grundfunktionalität des Mobiltelefons
ändern zu müssen.
Durch die vorliegende Technik wird es möglich,
polymorphe C++ Objekte im ROM abzulegen, um obigen Anforderungen
gerecht zu werden.
Um die Konfigurations-Objekte für das Target-System
generieren zu können, wird eine Host-Maschine (PC)
mit genügend Ressourcen verwendet.
Auf dem Host-System werden die Objekte instanziert.
Dabei ist es möglich, dass Objekte andere Objekte
referenzieren. Das heisst, dass auf dem Host-System
komplette Objekt-Strukturen aufbereitet werden können.
Die vorkonfigurierte Objekt-Struktur muss nun in einen,
für das Target-System binär-kompatiblen Byte-Buffer
geschrieben werden. Dabei muss vor allem dem Allignment
der Datenfelder und dem Zeiger auf die Virtual-Table
Beachtung geschenkt werden.
Das vorliegende Software-Paket ermöglicht es,
Datenstrukturen auf einem Host-System zu assemblieren
und einen entsprechenden Byte-Buffer für das Target-System
zu schreiben. Dabei ist es sogar möglich, dass
zyklische Referenzen in der Datenstruktur automatisch
aufgelöst werden.
Der Byte-Buffer mit der Objekt-Information wird auf
eine gewünschte Adresse reloziert. Das heisst,
dass sämtliche Referenzen so berechnet werden,
dass sie im entsprechenden Adressbereich zu liegen kommen.
Der erzeugte Byte-Buffer kann nun in den entsprechenden
Bereich des ROMs geschrieben werden.
Beim Startup des Target-Systems kann die im ROM liegende
Objekt-Struktur wie gewohnt verwendet werden, da sämtliche
Referenzen entsprechend angepasst, aber auch die Zeiger
auf die Virtual-Tables geschrieben wurden. Auch eine
unterschiedliche Byte-Order (Little-/Big-Endian) bei
Target- und Host-System wird automatisch detektiert.