logo

relocStream

Übersicht

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.

Technik

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.

relocStream ©

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.

Anforderungen an den Compiler

  • Target-Compiler
    • Grundsätzlich keine speziellen Anforderungen
    • wünschenswert
      • Template-Member-Funktionen
      • Template Funktionen
  • Host Compiler
    • Templates
    • Template-Member-Funktionen
    • Template Funktionen
    • RTTI