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