Forum: Compiler & IDEs AVR-GCC: globale Variable: "volatile" oder "static volatile"


von Statisch-Volatiler (Gast)


Lesenswert?

Hallo,

AVR-GCC: Komme gerade etwas ins Schleudern, denn ich verstehe nicht den 
Unterschied zwischen nur "volatile" und "static volatile" bei globalen 
8-Bit Variablen (atomarer Zugriff also garantiert!), die in ISRs und 
anderen Teilen des Programms verwendet werden. 
Beitrag "static & volatile......." und 
Beitrag "Variable extern volatile?" haben mit nicht geholfen.

von Εrnst B. (ernst)


Lesenswert?

Die beiden (static und volatile) haben nix miteinander zu tun, können 
also getrennt voneinander betrachtet werden.

Volatile: der Compiler darf keine Optimierungen mit dieser Variable 
vornehmen.
static (Bei Variablen innerhalb einer Funktion): Variable behält Wert 
zwischen zwei Funktionsaufrufen
static (bei globalen Variablen): Variable nicht als Symbol exportieren, 
andere C-Files können nicht auf die Variable zugreifen.

(Ja ich weiss... sehr vereinfacht ausgedrückt... aber für ein initiales 
Verständniss sollts reichen)

Ach ja, und mit atomarem Zugriff hat Volatile nichts zu tun, auch nicht 
bei 16- oder 32-Bit ints.

von Gast (Gast)


Lesenswert?

Gehe mal davon aus, dass du in C und nicht in C++ programmierst:

static - Wenn du eine globale Variable mit static deklarierst, ist diese 
nur innerhalb der Übersetzungseinheit, also in dem c-file wo du diese 
anlegst sichtbar. Ausserhalb der Übersetzungseinheit kann auf diese 
Variable nicht zugegriffen werden.

volatile - Der Compiler verhindert, dass die Variable in einem Register 
zwischengesichert wird. Den atomaren Zugriff musst du aber selber regeln 
(über Semaphore, oder kurzfristiges Abschalten von Interrupts).

von Jan Timmerman (Gast)


Lesenswert?

Ich habe C code von einer vormalige Kollege bekommen. In Seinem 
"globaldefinitions.h" hat Ehr nur "static" Variables declariert. Ich 
habe, auch in "globaldefinitions.h", ein neue Flag declariert aber ohne 
das "static" keyword. Das gab mir sehr komisches Output.(richtig 
Quatsch!) Wann Ich static zufüge dan is es richtig.

"Andere C-files können nicht auf die Variablen angreifen"
Aber alle C-files haben '#include globaldefinitions.h' so Alle sollen 
auf die static variablen angreifen können? Mann soll denken das Ich dann 
'static' einfach löschen kann?

Aber wie ist es dann möglich das mein Programm komisches output 
generiert?

Ich hoffe das Einer von Sie mir ein bischen Deutung geben kann, Ich habe 
keine ahnung warumm das passiert.

Danke Sehr! Schuldigung für mein slechtes Deutsch.. :)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jan Timmerman schrieb:

> Aber alle C-files haben '#include globaldefinitions.h' so Alle sollen
> auf die static variablen angreifen können?

Ja, das schon. Aber jede auf ihre eigenen static-Variablen.

static int a;

in Modul u.c und v.c sind zwei verschiedene Variablen!

Header wie "globals.h" künden m.M. nicht von gutem Programmierstil. Eine 
Variable sollte immer zu einem C-Nodul gehören und auch dort definiert 
werden.

Static, wenn die Modul-lokal ist und ansonsten nicht static. In 
letzterem Fall kommt die Deklaration dann in modul.h.

von Oliver (Gast)


Lesenswert?

Johann L. schrieb:
>> Aber alle C-files haben '#include globaldefinitions.h' so Alle sollen
>> auf die static variablen angreifen können?
>
> Ja, das schon. Aber jede auf ihre eigenen static-Variablen.

Was allerdings ein sehr, sehr seltsames Softwaredesign wäre.

Was für ein C-Compiler wurde denn da benutzt?

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Header wie "globals.h" künden m.M. nicht von gutem Programmierstil.

Gut, darüber könnte man sich noch streiten, aber eine als "static"
deklarierte Variable in einer Headerdatei namens "globaldefinitions.h"
zeugt eher von komplettem Unverständnis bezüglich der C-Deklarationen.

Das einzige "static", was in einer Headerdatei was zu suchen hätte,
wäre ein "static inline" für eine Funktionsdefinition.

von Jan Timmerman (Gast)


Lesenswert?

Ich benutze AVR-Studio 5.1.

Danke fur die Erklärung. Ich war ein bischen Konfus was das Effect sein 
soll wann mann static Variables in denn Headerfile deklariert. Jetzt 
verstehe Ich doch auch warum der Compiler sehr viel Warnings generiert 
wann Ich 'Rebuild all' ausfuhre. Fur jedem File der nicht die static 
Variabelen benutzt kriege Ich ein Warning :)

Ich denke, warum mein Kollege das getan hätte, Einzige der Variablen 
sind Strings denn Er in verschiedene Files benutzt. Und Er hat den 
Strings nicht schön deklariert, sonst auch definiert, was normalerweise 
nicht möglich ist wann mann ein headerfile in mehrere .c files benutzt.
Vielleicht hat er irgendwo in die Geschichte "static" hinzugefügt und 
dachte: "hmm, Gut, kein errors mehr"

Nun noch herausfinden warum es Komisch arbeit wann Ich kein "static" 
benutz. Doch ich verstehe jetzt warum es arbeit mit "static" so das soll 
ein grosse menge leichter sein mussen..

Danke nochmal!

von Peter D. (peda)


Lesenswert?

Jan Timmerman schrieb:
> Fur jedem File der nicht die static
> Variabelen benutzt kriege Ich ein Warning :)

Dann copy&paste mal die ersten paar Warnungen hier rein, damit wir sie 
verstehen können.
Ratespiele passen nämlich besser ins TV.

Und nächtes mal keine 4 Jahre alte Leiche ausgraben. Mach einen neuen 
Thread auf.


Peter

von Jan Timmerman (Gast)


Lesenswert?

Ah, enschuldigung, Ich dachte das ich das schon erklärt hat. Das ist 
kein issue mehr.

Die Ursache war: wann mann "static" Variables declariert in die 
"globaldeclarations.h" header file aber denn Variable nicht im jeden .c 
file benutzt dann generiert mann Warnings vor jedem mal den variable 
nicht benutzt is => ganz viel Warnings..

Ich dachte, diese alte Leiche seht ganz relevant aus so vielleicht is es 
gut gleiche probleme zusammen zu haben. Nächtes mal mache Ich ein neuen 
Thread.

von Karl H. (kbuchegg)


Lesenswert?

Jan Timmerman schrieb:
> Ah, enschuldigung, Ich dachte das ich das schon erklärt hat. Das ist
> kein issue mehr.
>
> Die Ursache war: wann mann "static" Variables declariert in die
> "globaldeclarations.h" header file aber denn Variable nicht im jeden .c
> file benutzt dann generiert mann Warnings vor jedem mal den variable
> nicht benutzt is => ganz viel Warnings..

Ich denke nicht, dass du den Problemkreis verstanden hast.

von Falk B. (falk)


Lesenswert?

@Johann L. (gjlayde) Benutzerseite

>Header wie "globals.h" künden m.M. nicht von gutem Programmierstil. Eine
>Variable sollte immer zu einem C-Nodul gehören und auch dort definiert
>werden.

Das schon, aber globale Variablen haben dennoch ihre Berechtigung. 
Gerade auf kleinen und kleinsten Mikrocontrollern, wo es bisweilen 
einfacher, resourchensparender und schneller ist, bestimmte 
Informationen über globale Variablen auszutauschen. Für Flags in 
Interrupts braucht man sie sowieso.

Also, wenn in globals.h NUR globale Variablen deklariert werden, 
natürlich OHNE static sondern mit extern, dann passt das absolut und ist 
sauber.

Ich vermute eher ein vermurkstes Projekt, wo der unbekannte Kollege auch 
nicht so reht wußte was er tat und solange irgendwo static 
hingeschrieben hat, bis die Warnings weg waren. Wenn gleich es das 
eigentliche Problem nicht gelöst hat.

MFG
Falk

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Falk Brunner schrieb:
> @Johann L. (gjlayde) Benutzerseite
>
>>Header wie "globals.h" künden m.M. nicht von gutem Programmierstil. Eine
>>Variable sollte immer zu einem C-Modul gehören und auch dort definiert
>>werden.
>
> Das schon, aber globale Variablen haben dennoch ihre Berechtigung.
> Gerade auf kleinen und kleinsten Mikrocontrollern, wo es bisweilen
> einfacher, resourchensparender und schneller ist, bestimmte
> Informationen über globale Variablen auszutauschen. Für Flags in
> Interrupts braucht man sie sowieso.

Ich sag ja auch nix gegen globale Variablen, sondern daß alles, was an 
globalem Zeug so rumschwirrt, in einen einzigen Header "globals.h" 
gekloppt wird.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Ich sag ja auch nix gegen globale Variablen, sondern daß alles, was an
> globalem Zeug so rumschwirrt, in einen einzigen Header "globals.h"
> gekloppt wird.

Kann schon Sinn haben.  Warum soll man 25 verschiedene Headerfiles
jeweils inkludieren?  Ich mache mir auch zuweilen ein einziges
project.h, welches die globalen Deklarationen des gesamten Projekts
enthält.  Exportierte Funktionen oder Variablen sind innerhalb dieses
Headers dann natürlich sortiert nach ihren Quelldateien, und die
steht auch im Kommentar drüber.

Ist halt Geschmackssache.

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.