14.01.2015 Aufrufe

Dynamische Adaption in heterogenen verteilten eingebetteten ...

Dynamische Adaption in heterogenen verteilten eingebetteten ...

Dynamische Adaption in heterogenen verteilten eingebetteten ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

4 Basisschicht e<strong>in</strong>es Verwalters<br />

aktiv ist. Der Entwickler kann so wertvolle H<strong>in</strong>weise erhalten, wie zukünftige Versionen der Software<br />

umgestaltet werden müssten, um die Voraussetzungen für e<strong>in</strong>e erfolgreiche Abhängigkeitsanalyse zu<br />

verbessern.<br />

Lösungsansatz: bei Beendigung benachrichtigen<br />

Um die periodische Überprüfung zu vermeiden, kann die Software auch <strong>in</strong> geeigneter Art und Weise<br />

verändert werden, sodass beim Verlassen der aktiven Funktion automatisch der Verwalter kontaktiert<br />

wird. Das konzeptionelle Vorgehen entspricht dem Anwenden e<strong>in</strong>es, aus der aspektorientierten Programmierung<br />

bekannten, after advice. Bei der Realisierung kann man nach zwei unterschiedlichen<br />

Verfahren vorgehen:<br />

1. E<strong>in</strong>e Möglichkeit ist, die Rücksprungadresse zu ermitteln und diese so abzuändern, dass der<br />

Rücksprung zu e<strong>in</strong>em Stück Code erfolgt, der den Verwalter kontaktiert. Dadurch wird der<br />

Verwalter beim Verlassen der Funktion sofort benachrichtigt. Die ursprüngliche Rücksprungadresse<br />

muss dabei gesichert werden, da sie benötigt wird, um das Programm nach der Operation<br />

fortzusetzen.<br />

Um diese Möglichkeit zu nutzen, muss es jedoch möglich se<strong>in</strong>, die Position der Rücksprungadresse<br />

zu ermitteln. Erzeugt der Compiler e<strong>in</strong>en Framepo<strong>in</strong>ter 8 , so kann man durch das Ablaufen<br />

des Stacks an die Rücksprungadresse gelangen. Wird ke<strong>in</strong> Framepo<strong>in</strong>ter generiert, so ist es im<br />

Allgeme<strong>in</strong>en nicht möglich, die Position der Rücksprungadresse zuverlässig zu bestimmen.<br />

2. Die zweite Möglichkeit basiert darauf, dass man <strong>in</strong> den vorhandenen Code an e<strong>in</strong>er geeigneten<br />

Stelle e<strong>in</strong>en Sprung zu der Benachrichtigungsfunktion e<strong>in</strong>setzt. So können beispielsweise die<br />

return-Anweisungen <strong>in</strong> der aktiven Funktion durch solche Sprünge ersetzt werden.<br />

Voraussetzung für dieses Vorgehen ist allerd<strong>in</strong>gs, dass man die Ablaufstruktur des Codes analysiert<br />

und ermitteln kann, an welchen Stellen die Funktion verlassen wird. Außerdem darf der<br />

Sprungbefehl nicht mehr Platz benötigen als der return-Befehl, da ansonsten die Struktur der<br />

Funktion zerstört wird 9 .<br />

Bei beiden Verfahren wird die Ausführung auf dem verwalteten Knoten nach der Veränderung fortgeführt.<br />

Sobald der Kontrollfluss die aktive Funktion verlässt, wird e<strong>in</strong> speziell vorbereitetes Codestück<br />

angesprungen, welches den Verwalter benachrichtigt. Daraufh<strong>in</strong> muss geprüft werden, ob die betrachtete<br />

Funktion immer noch aktiv ist. Um e<strong>in</strong> endloses Warten auf e<strong>in</strong>e Benachrichtigung zu verh<strong>in</strong>dern,<br />

muss der Verwalter aber auch bei diesem Verfahren e<strong>in</strong> Zeitfenster vorsehen, nach dessen Ablauf er die<br />

Operation abbricht, falls die Funktion nicht beendet wurde.<br />

Bei der Wahl zwischen den beiden Verfahren ist das erste Verfahren zu bevorzugen. Der Vorteil ist,<br />

dass hier ke<strong>in</strong> Code verändert werden muss, da die Rücksprungadresse im Datenbereich abgespeichert<br />

8 Der Framepo<strong>in</strong>ter zeigt auf den Anfang des Stackbereichs, der von der aktuellen Funktion benutzt wird. Dort ist üblicherweise<br />

auch die Rücksprungadresse abgelegt.<br />

9 Auf den von uns betrachteten Mikrocontrollern benötigt e<strong>in</strong>e return-Anweisung (H8: RTS, AVR: RET) zwei Byte.<br />

Direkte Sprungbefehle mit absoluter Zieladresse (JMP) benötigen hier vier Byte, da nicht nur der Befehl, sondern auch<br />

die 16-bit Zieladresse codiert werden muss. Indirekte Sprungbefehle benötigen auf den betrachteten Plattformen nur<br />

zwei Byte, s<strong>in</strong>d aber nicht une<strong>in</strong>geschränkt geeignet. Für register-<strong>in</strong>direkte Sprünge (H8: JMP, AVR: IJMP/EIJMP)<br />

müssen zusätzliche Befehle e<strong>in</strong>gefügt werden, um die Zieladresse <strong>in</strong> das entsprechende Register abzulegen. Für e<strong>in</strong>en<br />

speicher-<strong>in</strong>direkten Sprung könnte der Verwalter die Zieladresse <strong>in</strong> e<strong>in</strong>en unbenutzten Speicherbereich abgelegen. Der<br />

AVR bietet jedoch ke<strong>in</strong>en <strong>in</strong>direkten Sprungbefehl mit Zieladresse <strong>in</strong> e<strong>in</strong>er variablen Speicherstelle. Am besten eignen sich<br />

daher relative Sprünge (H8: BRA, AVR: RJMP). Sie haben allerd<strong>in</strong>gs den Nachteil, dass nicht der gesamte Adressraum<br />

erreicht werden kann.<br />

70

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!