Hallo,
ich verstehe die Welt nicht mehr, daher, please help.
(Ich verwende AVR Studion 4 mit GNU GCC Compiler für AVR Mega; Sprache:
Standard "C")
Problem:
Im hauptprogramm setze ich nach der Initialisierung in der
Hauptprogrammschleife sekündlich eine global deklarierte Steuervariable
"OneWireFlag", die im Time-Compare-Intterrupt (Timerclock 0,5 us)
ausgewertet wird. danach wird ein kurzes Stepping durchlaufen, wobei die
Steuervariable das Ganze händelt.
Soweit, so gut, das geht alles. Am Ende wird die Steuervariable auif
einen "Endcode", hier 0x88 gesetzt.
Das Hauptprogramm wartet nun in einer while-Schleife auf diesen Endcode.
Solange die Warteschleife nur aus:
while (OneWireFlag != 0x88) {
wdt_reset()
}
besteht, funktioniert es nicht. Die Schleife wird nie verlassen, bzw.
der Wert von OneWireFlag wird nicht ausgewertet.
Das klappt dann erst, wenn ich zusätzlich eine komplexere Subroutine in
der Schleife aufrufe. Nur das einfügen von Inline "nop" bringt nichts...
Für mich ist das ein Compilerproblem bzw. ein Optimierungsproblem???
Hat einer eine Idee? Mir fehlen dazu die Erfahrungen mit dem GNU GCC.
Danke.
So, die Programmschipsel hänge ich mal an:
Ausschnitt aus dem Hauptprogramm:
Aufruf der Subroutine
Hanns-Jürgen "Yogy" Mostert schrieb:> Solange die Warteschleife nur aus:>> while (OneWireFlag != 0x88) {> wdt_reset()> }>> besteht, funktioniert es nicht. Die Schleife wird nie verlassen, bzw.> der Wert von OneWireFlag wird nicht ausgewertet.>> Das klappt dann erst, wenn ich zusätzlich eine komplexere Subroutine in> der Schleife aufrufe. Nur das einfügen von Inline "nop" bringt nichts...
Da fehlt dann wohl ein "volatile".
Stefan Ernst schrieb:> Hanns-Jürgen "Yogy" Mostert schrieb:>> Solange die Warteschleife nur aus:>>>> while (OneWireFlag != 0x88) {>> wdt_reset()>> }>>>> besteht, funktioniert es nicht. Die Schleife wird nie verlassen, bzw.>> der Wert von OneWireFlag wird nicht ausgewertet.>>>> Das klappt dann erst, wenn ich zusätzlich eine komplexere Subroutine in>> der Schleife aufrufe. Nur das einfügen von Inline "nop" bringt nichts...>> Da fehlt dann wohl ein "volatile".
hmm, wo soll das denn bitte hin?
Hanns-Jürgen "Yogy" Mostert schrieb:> hmm, wo soll das denn bitte hin?Hanns-Jürgen "Yogy" Mostert schrieb:> Ach so, ich hatte doch geschrieben, daß diese Variable GLOBAl deklariert> wurde als:>> U8 OneWireFlag = 0;
Informiere dich darüber, was "volatile" überhaupt bedeutet, dann weißt
du auch, wo und warum es hier nötig ist.
volatile wirkt hier zwar überraschednerweise, aber, wie gesagt ,
überaschenderweise.
Laut dem Schirmer-Buch über "C"
"Mit dem Attribut 'volotile' sagen sie über eine Variable aus, daß ihr
Typ implementierungsabhängige Eigenschaften besitzen kann.Genaueres legt
der ANSI-Standard hier nicht fest. Insbesondere werden volotile-Objekte
von der Optimierung beim Compilieren ausgeschlossen"
So, was sagt das jetzt?!
a) Der Compiler verschluckt Variablen, obwohl sie benutzt werden? So was
hätte mir früher einer implementieren sollen, Au Backe
b) unbekanntes Verhalten im ANSI Dschungel? In der GNU Compiler Doku
steht nix zu volotile
Aber egal, danke für die Hilfe, es funzt mit volotile. Problem für mich
hier gelöst. Happy Halloween :-)
Yogy
Hanns-Jürgen "Yogy" Mostert schrieb:> volatile wirkt hier zwar überraschednerweise, aber, wie gesagt ,> überaschenderweise.
Nein, nicht überraschend.
FAQ: Was hat es mit volatile auf sich> So, was sagt das jetzt?!>> a) Der Compiler verschluckt Variablen, obwohl sie benutzt werden?
Das sagt es nicht aus
> Aber egal, danke für die Hilfe, es funzt mit volotile.
Es heißt volAtile.
UNd lies die FAQ. Dann verstehst du auch wo das Problem liegt.