7.3 Compiler für eingebettete Systeme
395
Beispiel 7.8: Speichersegmente für ARM-Prozessoren können wie folgt durch Einführung von Pragmas in den Quellcode festgelegt werden:
# pragma arm section rwdata = =fooo, rodata = =barr
Die nach diesem Pragma deklarierten Variablen würden dem Lese-/Schreibsegment fooo und Konstanten entsprechend dem Nur-Lesesegment barr zugeordnet
werden. Linkerbefehle können dann diese Segmente auf festgelegte Adressbereiche,
unter anderem auch in den SPM, abbilden.
∇
Dieser Ansatz wird von Compilern für ARM-Prozessoren verwendet [19]. Dieser Ansatz ist jedoch nicht sehr komfortabel. Es wäre daher schön, wenn Compiler solche Abbildungen für häufig verwendete Objekte automatisch durchführen
könnten. Dafür wurden spezielle Optimierungsalgorithmen entwickelt. Ein Teil der
Optimierungen wurde in einem separaten Buch vorgestellt [377]. Die verfügbaren
SPM-Optimierungen fallen dabei in eine der beiden Kategorien:
• Nicht-überlagernde (engl. non-overlaying) oder „statische” Speicherzuordnungsstrategien: Bei diesen Strategien bleiben Speicherobjekte im SPM, solange
die zugehörige Anwendung ausgeführt wird.
• Überlagernde (engl. overlaying) oder „dynamische” Speicherzuordnungsstrategien: Bei diesen Strategien werden Objekte zur Laufzeit in den SPM verschoben
und wieder aus diesem verdrängt. Dies stellt eine Art „Compiler-kontrollierten
Seitenaustauschs” dar. Allerdings findet der Austausch von Objekten zwischen
dem SPM und einem langsameren Speicher statt, anstelle der Auslagerung von
Speicher auf Festplatten.
Nicht-überlagernde Zuordnung
Die nicht-überlagernde Zuordnung betrachtet die Zuordnung von Funktionen und
globalen Variablen zum SPM. Dafür wird jede Funktion und jede globale Variable
als Speicherobjekt modelliert. Seien
• S die Größe des SPM,
• s f i und sv i die Größen der Funktion i bzw. der Variablen i,
• g die Energiemenge, die pro SPM-Zugriff eingespart wird (also die Differenz
zwischen den Energien für einen Zugriff auf den langsamen Hauptspeicher und
für einen Zugriff auf den SPM),
• n f i und nv i die Anzahl der Zugriffe auf Funktion i bzw. Variable i,
• x f i und xv i definiert als
x f i =
1 wenn Funktion i auf den SPM abgebildet ist
0 sonst
(7.1)
xv i =
1 wenn Variable i auf den SPM abgebildet ist
0 sonst
(7.2)
395
Beispiel 7.8: Speichersegmente für ARM-Prozessoren können wie folgt durch Einführung von Pragmas in den Quellcode festgelegt werden:
# pragma arm section rwdata = =fooo, rodata = =barr
Die nach diesem Pragma deklarierten Variablen würden dem Lese-/Schreibsegment fooo und Konstanten entsprechend dem Nur-Lesesegment barr zugeordnet
werden. Linkerbefehle können dann diese Segmente auf festgelegte Adressbereiche,
unter anderem auch in den SPM, abbilden.
∇
Dieser Ansatz wird von Compilern für ARM-Prozessoren verwendet [19]. Dieser Ansatz ist jedoch nicht sehr komfortabel. Es wäre daher schön, wenn Compiler solche Abbildungen für häufig verwendete Objekte automatisch durchführen
könnten. Dafür wurden spezielle Optimierungsalgorithmen entwickelt. Ein Teil der
Optimierungen wurde in einem separaten Buch vorgestellt [377]. Die verfügbaren
SPM-Optimierungen fallen dabei in eine der beiden Kategorien:
• Nicht-überlagernde (engl. non-overlaying) oder „statische” Speicherzuordnungsstrategien: Bei diesen Strategien bleiben Speicherobjekte im SPM, solange
die zugehörige Anwendung ausgeführt wird.
• Überlagernde (engl. overlaying) oder „dynamische” Speicherzuordnungsstrategien: Bei diesen Strategien werden Objekte zur Laufzeit in den SPM verschoben
und wieder aus diesem verdrängt. Dies stellt eine Art „Compiler-kontrollierten
Seitenaustauschs” dar. Allerdings findet der Austausch von Objekten zwischen
dem SPM und einem langsameren Speicher statt, anstelle der Auslagerung von
Speicher auf Festplatten.
Nicht-überlagernde Zuordnung
Die nicht-überlagernde Zuordnung betrachtet die Zuordnung von Funktionen und
globalen Variablen zum SPM. Dafür wird jede Funktion und jede globale Variable
als Speicherobjekt modelliert. Seien
• S die Größe des SPM,
• s f i und sv i die Größen der Funktion i bzw. der Variablen i,
• g die Energiemenge, die pro SPM-Zugriff eingespart wird (also die Differenz
zwischen den Energien für einen Zugriff auf den langsamen Hauptspeicher und
für einen Zugriff auf den SPM),
• n f i und nv i die Anzahl der Zugriffe auf Funktion i bzw. Variable i,
• x f i und xv i definiert als
x f i =
1 wenn Funktion i auf den SPM abgebildet ist
0 sonst
(7.1)
xv i =
1 wenn Variable i auf den SPM abgebildet ist
0 sonst
(7.2)
