Was genau bewirkt das Keyword volatile/__volatile__ ??
-
Frage steht eigentlich schon im Titel, ich fasse es aber noch etwas konkreter. Ich arbeite zur Zeit mit extended inline assembly im GCC/MinGW und habe gestern mal versucht mit Compiler-Optimierungen meinen Source zu übersetzen.
Allerdings fuscht der GCC jetzt auch in meinen inline asm-Blöcken rum und das führt zu etwas komischen Ergebnissen, da er beim Laden in die general-purpose Register nicht mehr so vorgeht wie wenn er ohne Optimierungen arbeiten würde. Ganz konkret heisst das, dass er einen Pointer nicht mehr wie angeordnet in ESI lädt, sondern irgendwo anders hin und dazu auch noch an ganz anderer Stelle im Code (er inlined da ziemlich viel, deshalb ist das ganze schön unübersichtlich).Nun gut, er kann ja von mir aus inlinen das würde mich ja nicht stören, aber bitte den ASM-Code ansich in Ruhe lassen. Ich habe jetzt schon X Tutoriale/Dokumente über das Thema hier liegen und da wird an verschiedenen Stellen das volatile (oder __volatile__) Keyword angesprochen. Allerdings wird immer nur gesagt wann man es anwenden sollte bzw. könnte.
Da steht nur nicht was genau das jetzt für eine Auswirkung auf die Arbeit des Compilers hat. Ich hätte gerne irgendwas wie eine Liste von Punkten, die Auskunft darüber gibt was mit dem als volatile gekennzeichneten ASM-Code denn jetzt anders geschieht als dem ohne volatile.Danke schonmal!
cya
liquid
-
Der Modifier volatile sagt dem Vompiler, dass der Wert einer Variable sich auf eine Weise ändern kann, die vomm Programm nicht explizit festgelegt ist. Zum Beispiel kann die Adresse einer globalen Variable an die Uhrenroutine des Betriebssystems übergeben und mit jedem Uhrticken aktualisiert werden. In dieser Situation werden die Inhalte der ariablen ohne irgendwelche expliziten Zuweisungsanweisungen im Programm geändert. Dies ist wichtig, weil der Compiler manchmal bestimmte Ausdrücke automatisch optimieren, indem sie annehmen, dass die Inhalte einer Variable sichh innerhalb eines Ausdrucks nicht ändern. Damit soll eine bessere Performance erreicht werden. Dervolatile-Modifier verhindert diese Optimierung in jenen seltenen Situationen, in denen diese annahme falsch ist.
Es sollten Variablen, die von der Hardware geändert werden, wie Echtzeituhren, Interrupts oder anderer Input als volatile deklariert werden.
-
So, und jetzt das ganze bitte noch mal für inline assembly Code.
cya
liquid