static Variablen

Gast #1257831
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.
@  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
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
Persönliche Seite
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.