Hallo!
Ich habe da eine Frage zu "volatile".
Ich weiß, dass eine globale Variable, die ich sowohl in einer ISR als auch im Hauptprogramm verwende, "volatile" deklariert und der Zugriff im Hauptprogramm auf diese Variable atomar sein muss, wenn sie >8Bit ist (Variable > 8Bit => mit cli(), sei() etc). Diese Mechanismen sind mir bekannt und klar.
Wenn ich aber in einem anderen File eine globale Variable habe, die ich in DIESEM anderen File verwende (z.B. befüllen eines Buffers durch eine RECEIVE ISR des USART) und diesen Buffer auch in einem weiteren, anderen "Hauptfile" verwende - muss diese globale Variable dann auch "volatile" sein?
Ich vermute schon, da auf diese Variable sowohl in der ISR als auch im Hauptprogramm zugegriffen wird und die ISR während des Zugriffs im Hauptprogramm durch die ISR geändert werden kann.
Allerdings habe ich da jetzt ein Problem - ist diese globale Variable NICHT als "volatile" deklariert, erhalte ich beim Kompilieren keine Warnung.
Ist diese Variable als "volatile" deklariert, erhalte ich eine Warnung:
"warning: passing argument 1 of 'strlen' discards qualifiers from pointer target type "
Das "Problem" ist die Variable "char rec_buf[BUF]"
CodeBox C
wenn die Variable "rec_buf[BUF]" "volatile" ist, erhalte ich die Warnung: "warning: passing argument 1 of 'strlen' discards qualifiers from pointer target type ",
und ich versteh' nicht, warum diese Warnung erzeugt wird, wenn die Variable "volatile" ist; ist sie es nicht => keine Warnung.
Vielleicht weiß jemand
- warum diese Warnung
- was mache ich da falsch
- was muss ich machen, damit diese Warnung nicht mehr erscheint
mfg
Hero_123
Ich habe da eine Frage zu "volatile".
Ich weiß, dass eine globale Variable, die ich sowohl in einer ISR als auch im Hauptprogramm verwende, "volatile" deklariert und der Zugriff im Hauptprogramm auf diese Variable atomar sein muss, wenn sie >8Bit ist (Variable > 8Bit => mit cli(), sei() etc). Diese Mechanismen sind mir bekannt und klar.
Wenn ich aber in einem anderen File eine globale Variable habe, die ich in DIESEM anderen File verwende (z.B. befüllen eines Buffers durch eine RECEIVE ISR des USART) und diesen Buffer auch in einem weiteren, anderen "Hauptfile" verwende - muss diese globale Variable dann auch "volatile" sein?
Ich vermute schon, da auf diese Variable sowohl in der ISR als auch im Hauptprogramm zugegriffen wird und die ISR während des Zugriffs im Hauptprogramm durch die ISR geändert werden kann.
Allerdings habe ich da jetzt ein Problem - ist diese globale Variable NICHT als "volatile" deklariert, erhalte ich beim Kompilieren keine Warnung.
Ist diese Variable als "volatile" deklariert, erhalte ich eine Warnung:
"warning: passing argument 1 of 'strlen' discards qualifiers from pointer target type "
Das "Problem" ist die Variable "char rec_buf[BUF]"
CodeBox C
in *.h Datei #define BUF 80 /* Char-Buffer Wert einlesen - Empfangsbuffer*/ extern char rec_buf[BUF]; /* Char-Buffer Wert per USART einlesen */ in lib: char rec_buf[BUF]; /* Char-Buffer Wert per USART einlesen */ /* ISR - wenn Daten reinkommen - USART RX Interrupt */ extern ISR(UART0_RECEIVE_INTERRUPT) { c = UART0_DATA; /* BUF = 80 => 0.. 79 */ if((rec_count < BUF)||(c !='e')) { /* z.B rec_count =78 */ rec_buf[rec_count] = c; rec_count++; /* rec_count = 79 => ENDE!!! */ } if((rec_count == (BUF-1))||(c== 'e')) { /* rec_count == 80-1 oder c = e */ rec_buf[rec_count] = '\0'; /* Null-Zeichen fuer String-Ende */ rec_flag = 1; /* Eintrag fertig -> Empfangs-Flag = 1*/ rec_count = 0; } } im Hauptprogramm: while(zahl < strlen(rec_buf)) { if(rec_buf[zahl] !='#') { temp_buf[temp_count] = rec_buf[zahl]; temp_count++; zahl++; }
wenn die Variable "rec_buf[BUF]" "volatile" ist, erhalte ich die Warnung: "warning: passing argument 1 of 'strlen' discards qualifiers from pointer target type ",
und ich versteh' nicht, warum diese Warnung erzeugt wird, wenn die Variable "volatile" ist; ist sie es nicht => keine Warnung.
Vielleicht weiß jemand
- warum diese Warnung
- was mache ich da falsch
- was muss ich machen, damit diese Warnung nicht mehr erscheint
mfg
Hero_123