www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik static Variablen


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.