Hallo, wenn man eine Variable hat die in einr ISR und im Hauptprogramm geändert wird muss diese ja volataile sein. Nun habe ich aber noch structuren die sowohl in der ISR und im Hauptprogramm geändert werden. Diese kann ich aber gar nicht volataile machen sondern nur static. In der ISR greif ich dann natürlich mit dem Punktoperator darauf zu. Kann das Probleme geben, wenn ich in einer ISR auf die structur zugreife da diese ja nicht volataile ist?
Ach? Was hältst Du davon, einen Quelltextschnipsel und die betreffende Compilerfehlermeldung hier zu veröffentlichen?
static struct structname SIGNAL (SIG_OVERFLOW1) { structname.xyz=1; } void main(void) { structname.xyz=2; .... } So sieht der code jetzt aus. Das hat bis jetzt auch immer funktioniert. Nur habe ich jetzt gelesen das variablen die in ISRs und imHauptprogramm genutzt werden volatile sein müssen.
Ich sehe keine Fehlermeldung. Weißt Du, was im von Dir zitierten Codeschnipsel das Schlüsselwort "static" bewirkt?
Ja. Das heist diese Variable ist nur in diesem Modul zu sehen. Das modul von dem der Schnipsel stammt heist main.c. In meinem main.c gibt es halt die funktion void main(void) und sämtliche ISR sind dort programmiert. Jetzt meine Frage. Im AVR GCC Tutorial steht das variablen die in einer ISR benutzt werden und im Hauptprogramm müssen volatile sein. Nun ist meine Strukutr aber static. Ich nutze die Struktur in mehrern ISR´s und im Hauptprogramm. Ist dies schlimm. Bis jetzt funktioniert es nämlich.
Wie definierst Du eigentlich Deine Struktur? Versuch mal typedef struct { int xyz; int abc; } mystruct; volatile mystruct astruct; Das gibt bei mir keine Fehlermeldung. > Wenn ich die structur mit volatile anlegen will bekomme ich > compiler fehler. Bei so einer Aussage solltest Du eigentlich mal den Code + den Wortlaut der Fehlermeldung posten. Welchen Compiler Du verwendest könntest Du auch mal erwähnen.
Also ok main.c:13: warning: passing arg 1 of `going' discards qualifiers from pointer target type Das war die Fehlermeldung. #include <avr\io.h> #include "struct.h" #include "test.h" volatile port hallo; int main(void) { hallo.abc=0; going(&hallo); do { } while(1); return 0; } Das war der Code. Jetzt aber noch mal zurück zur anderen Frage. Kann die structur static bleiben wenn ich in ISR darauf zugreife und im Hauptprogramm?
Hi leute.... hmm...hab mal so ne frage nebenbei!Also,was bringt mir so ne STRUCT eigentlich? wofür verwendet ihr den die beim µC progn?? sorry wegen der Frage aber ich will halt noch lernen ;) mfg Cri
Wetten das going() den Parameter nicht als "pointer to violatile ..." deklariert hat?
@micro1:
So jetzt haben wir eine Fehlermeldung.
Aber wieder keine Definition der Struktur. Und um zu verstehen was bei
Dir falsch läuft bräuchte man auch noch die Definition der Funktion
going. Die ISR wäre auch nicht schlecht.
Der Punkt ist volatile kannst und sollst Du verwenden.
@Cri Gri:
> wofür verwendet ihr den die beim µC progn??
Aus dem gleichen Grund wie jeder sonst struct verwendet. Strukturieren
;-) Zusammenfassen von einzelnen Variablen zu einem neuen Datentyp. Das
hat nix mit µC zu tun.
hier die structur ist nur ein Beispiel mein Orginal quellcode ist zu lang aber vom selben typ #ifndef struct_h typedef struct { unsigned int abc:1; }port; #define struct_h 1 #endif nun kommt die funktion going plus header #include "struct.h" void going(port *hallo); #include "test.h" #include "struct.h" void going(port *hallo) { int x; } und nun die isr SIGNAL(SIG_OVERFLOW0) { hallo.abc=1; }
"void going(port *hallo);" Sach ich doch. Schreib da void going(volatile port *hallo); und schon sieht's besser aus. Mit "static" gibt es deshalb keinen Fehler, weil "static" kein Bestandteil vom Datentyp ist, "volatile" jedoch schon.
Ah jetzt funktionierts. Danke. Aber ich verstehe immer noch nicht das es mit static trozt zugriff in einer ISR immer funktioniert. Weis da jemand genau bescheit drüber. Ich habe mir nämlich den Assembler code angeschaut. Meine volatile varibalen werden in der ISR mit "LDI" geladen. Mein static variablen aber auch?
@A. K. Genau. Das selbe Problem hätte der OP bei Verwendung von const. Beides sind "type qualifier" die auf jeden Datentyp angewendet werden können. Damit natürlich auf selbst definierte, sprich structs. Normalerweise sollte es aber "nur" eine Warnung sein. (Ich denke auch, daß jede Warnung eigentlich ein Fehler ist)
> [...] Mein static variablen aber auch?
Verwendest Du überhaupt Compiler-Optimierungen?
Wenn nicht, sollte ein volatile eigentlich nicht notwendig sein. Aber
Du machst die Funktionalität Deines Programms von den Compiler-Optionen
(und der Implementierung des Compilers) abhängig.
static und volatile schließen sich nicht gegenseitig aus. Sie sind haben unterschiedliche Funktionen static gehört in die gleiche Gruppe wie extern, auto oder register (und mutable in c++) Sie bestimmen die Art und Weise in der die Variablen und/oder Funktionen gespeichert werden. Dagegen gehört volatile zu den qualifier genau wie const. Volatile bestimmt, daß der Compiler nicht versuchen soll einen Zugriff auf diese Variablen (weg zu)-optimieren. Du kannst z. B. eine Variable auch als static volatile int x; deklarieren. Selbst ein static volatile const int x; ist syntaktisch in Ordnung. Beispiel für eine mögliche Optimierung (Etwas stark konstruiert) Du hast die Variable unsigned long * RTC = 0xFFFE200; unsigned long secs; Später hast Du im Hauptprogramm die Zeilen ms=*RTC; printf("%d",ms); ms=*RTC; printf("%d",ms); Ein Optimierer könnte auf die Idee kommen die zweite Zuweisen wegzulassen, da sich an dem Inhalt an der Adresse 0xFFE200 nichts geändert hat, da nicht auf RTC zugegriffen wurde. In Wirklichkeit steht z. B. an dieser Adresse eine Uhrzeit in ms die sich zwischen den Zuweisungen durch einen Interrupt geändert hat. Um so eine Optimierung zu verhindern würde man ein volatile als qualifier hinzufügen. also: volatile unsigned long * RTC = 0xFFFE200; Ich hoffe das habe ich zu später Stunde noch fehlerfrei hinbekommen ;-)
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.