Forum: Mikrocontroller und Digitale Elektronik static Variablen


von Gast (Gast)


Lesenswert?

Hallo,

habe da mal eine Frage.

denke, das ich das so richtig verstanden habe, das wenn Variablen in 
einer ISR oder in Funktionen als static deklariert werden, diese einen 
festen Platz im RAM haben. Beim Zugriff auf diese, wird ihr Inhalt immer 
aus dem RAM gelesen oder abgelegt.


Eine Variable die in z.B. einer Funktion nicht als static deklariert 
ist, wird jedes mal, beim Aufruf dieser Funktion neu angelegt. Muß aber 
nicht im RAM sein.



Wenn ich nun vor der main Funktion eine Variable ohne static deklariere, 
so ist die als modulglobal zu sehen und defaultmässig static, denke ich.
Dieses static wäre hier optional. Muss aber nicht davor.

Ist das so richtig?

Also:

int a = 0;
static int b = 0;

main()
{



}

Die Variablen a und b sind beide im RAM und werden immer von dort 
gelesen und geschrieben. Hier ist static nicht zwingend notwendig.

von Falk B. (falk)


Lesenswert?

@  Gast (Gast)

>Die Variablen a und b sind beide im RAM und werden immer von dort
>gelesen und geschrieben.

Nein. Sie sind global. Der Compiler kann sie aber auch in Registen 
halten. Macht er bisweilen auch, darum braucht man volatile, um zwischen 
ISR und Hauptprogramm zu kommunizieren. Dann werden die Variablen auch 
nicht zwangsweise im RAM landen, praktisch aber schon. Siehe 
Interrupt.

> Hier ist static nicht zwingend notwendig.

Ja. Aber static für Variablen ausserhalb von Funktionen heisst, dass 
diese nur in dieser Datei sichtbar sind. Andere Funktionen in anderen 
Dateien können auf sie nicht zugreifen. Also ein "halbglobale" Variable.

MFG
Falk

von Иван S. (ivan)


Lesenswert?

Gast schrieb:

> int a = 0;
> static int b = 0;
>
> Die Variablen a und b sind beide im RAM und werden immer von dort
> gelesen und geschrieben. Hier ist static nicht zwingend notwendig.

Wenn es der Compiler für vorteilhaft erachtet, kann eine static-variable 
auch wegoptimiert werden. Also nicht darauf verlassen, daß sie im 
Speicher bleibt.
Nur volatile kann nicht wegoptimiert werden.

hth, Iwan

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

nicht ganz. Wenn eine Variable außerhalb einer Funktion als static 
deklariert wird so ist sie nicht außerhalb des Moduls sichtbar. Es kann 
in zwei Modulen also zweimal die gleich benannte Variable geben. Diese 
teilen sich dann nicht die gleiche Stelle im RAM. Es handelt sich um 
zwei komplett unterschiedliche Variablen.

Wird eine Variable nicht als static deklariert so ist sie über 
Modulgrenzen hinweg nutzbar. Deklariert man in einem anderen Modul eine 
Variable mit gleichem Name so meckert entweder der Linker (sollte er) 
oder aber diese beiden Variablen teilen sich den gleichen Speicher.

Matthias

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
Noch kein Account? Hier anmelden.