Hallo, wann genau müssen die Compiler Anweisungen static und volatile vor eine Variable bei der Deklaration gesetzt werden? Welche Fehler könnten auftreten, würden diese Anweisungen vernachlässigt? mfg .ö.
"Static" braucht man, wenn die Variable permanent im Speicher vorhanden sein soll, auf einer festen Adresse. Sonst könnte es eine "auto" Variable sein, die am Stack liegt. "Volatile" muss verwendet werden, wenn man auf I/O Pins und Ports schreibt oder liest. Ohne diese Definition kann es sonst passieren, dass der Compiler mehrfaches lesen / schreiben "wegoptimiert". Klaus
"static" hat aber auch noch andere Auswirkungen. Als "storage class specifier" vor einer außerhalb eines Funktionsrumpfes deklarierten Variablen bedeutet "static", daß auf diese Variable nur von Funktionen innerhalb dieses Modules zugegriffen werden kann, daß also kein Symbol für den Linker exportiert wird. Als Prefix einer Funktion bedeutet "static", daß diese Funktion nur von Funktionen innerhalb dieses Modules aufgerufen werden kann, daß also auch hier für den Linker kein Symbol exportiert wird. "volatile" bedeutet, daß der Compiler keinerlei Annahmen über den in der Variablen gespeicherten Wert treffen darf, daß also der Inhalt der Variablen sich "hinter dem Rücken" des Programmes ändern kann. Das geschieht, wie Klaus bereits erwähnte, beispielsweise bei I/O-Pins, aber auch bei Variablen, die aus einem Interrupthandler heraus verändert werden und ist auch bei Multithreading-Anwendungen relevant.
Praktisch gesagt, ist volatile immer dann nötig, wenn auf eine Variable in einer Schleife gepollt wird, die in einem Interrutphandler geändert wird. Leider kann man nicht auf volatile casten, d.h. auch der Interrupthandler geht dann davon aus, daß er diese Variable bei jeder Verwendung immer neu lesen bzw. schreiben muß. In diesem Fall kann es effektiv sein, diese Variable in einer lokalen Variable zu speichern, dann diese lokale Kopie zu verweden und erst am Ende des Interrupthandlers wieder zurück zu speichern. Man kann volatile aber vermeiden, indem man zum Auslesen eine extra Funktion verwendet. Die pollende Schleife muß dann jedesmal diese Funktion aufrufen. Ein Funktionsaufruf darf nämlich nie wegoptimiert werden. Das empfielt sich sowieso, wennn diese Variable >8Bit ist, also nicht atomar gelesen werden kann und somit unter Interruptsperre gelesen werden muß. Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.