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.
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.
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).
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.. :)
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.
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
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.
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!
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
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.
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.
@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
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.
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.