Forum: Compiler & IDEs Problem mit volatile Variablen


von Thomas P. (Gast)


Lesenswert?

Ich habe ein Problem mit einer volatile Variable die im Unterprogramm
stets Null ist!

main.c
1
volatile uint8_t mysreg = 0;
2
3
int main(void)
4
{
5
  mysreg |= (1 << 0); //BIT 0 setzen
6
7
  {..
8
  //zyklischer aufruf von testfunk...
9
  testfunk();  
10
  }..
11
  return 0;
12
}

main.h
1
extern volatile uint8_t mysreg;

test.c
1
void testfunk()
2
{
3
  if(mysreg & (1 << 0))
4
  {
5
  //mache irgendewas
6
  portd |= 0b00010000;
7
  }
8
}

Die testfunk wird wie geschrieben zyklisch aufgerufen. Jedoch hat das
mysreg in der testfunk stets den Wert 0!
Wie kann das sein? In der test.c ist selbstverständlich die main.h
includiert, so dass die Variable mysreg bekannt ist!
mysreg wird nirgends anders gelöscht; lediglich in einer
Interrupt-Funktion (Timer-Overflow) wird das zweite BIT getoggelt. Das
kann ich dann auch in der main-Funktion auswerten - aber nicht mehr in
der testfunk! -> kurz und knapp, ausserhalb main.c ist die Variable
mysreg ungleich der Variable mysreg in main.c !

Vlt. hat jemand einen Hinweis für mich.

von Michael Wilhelm (Gast)


Lesenswert?

Die Endlosschleife in main fehlt.

MW

von Jürgen (Gast)


Lesenswert?

{..
//zyklischer aufruf von testfunk...  testfunk();
}..


ich hätte jetzt erwartet die Endlosschleife würde sich in den Punkten
verstecken ;-)

von Thomas P. (Gast)


Lesenswert?

Ja!

So ist das...
1
..
2
while(1)
3
{
4
//...
5
testfunk();
6
fwait(1000);
7
}
8
..

Und diese Endlosschleife steckt hinter den Punkten ;-) Bitte sagt jetzt
nicht, dass euch noch fwait fehlt :-( Das ist eine Verzögerungsfunktion,
die hier lediglich 1000ms wartet!

von Karl heinz B. (kbucheg)


Lesenswert?

Mach doch bitte mal ein komplettes Program fertig.
So dass wir es per Copy&Paste in unsere Entwicklungsumgebungen
übernehmen können und uns dort mal anschauen können was
da los ist.

von Thomas P. (Gast)


Angehängte Dateien:

Lesenswert?

Also

Anbei mein komplettes Projekt.

es geht um "ui_dcfsreg" - diese Variable ist in Funktionen von
dcf77.c stets Null!

von Karl heinz B. (kbucheg)


Lesenswert?

Kann ich nicht bestätigen.

Wenn ich das ganze durch den Simulator jage (ist etwas
schwierig da ich nicht deine Hardware habe. Ein eigenes
Testprogramm nur zu diesem Problem wäre besser gewesen),
dann verhält sich das Teil so wie es soll: Wenn im
SIG_INTERUPT0 ui_dcfsreg verändert wird, so kann ich die
Änderung beim nächsten Aufruf von dcf77_out sehen.
Das ist auch ok so, da mir der Debugger zeigt, dass es sich
um ein und dieselbe Variable handelt, da in beiden Fällen
dieselbe Speicheradresse für ui_dcfsreg angegeben wird.

von Thomas P. (Gast)


Lesenswert?

Nach meinem Wissen ist die Deklaration in der main.h mit extern auch
richtig, sonst könnte ich nicht in dcf77.c auf die Variable zugreifen.

Wie kann es sein, dass es letztendlich auf der Hardware nicht läuft?
Kann doch eigentlich unmöglich sein...

von Karl heinz B. (kbucheg)


Lesenswert?

> Nach meinem Wissen ist die Deklaration in der main.h mit extern
> auch richtig, sonst könnte ich nicht in dcf77.c auf die Variable
> zugreifen.

Ja, das ist alles richtig so wie du das gemacht hast.

Dein Problem muss also nach meinem Ermessen wo anders liegen.
Wie hast du überprüft, dass ui_dcfsreg überhaupt jemals
auf 0x01 gesetzt wird?

von Thomas P. (Gast)


Lesenswert?

Ich lasse mir das "byte" via USART ausgeben. Direkt dort wo es
beschrieben wird, und dann ein zweites mal in dcf77_out! Dort sind sie
dann unterschiedlich!

Besten Dank für deine Mühen

von Karsten Brandt (Gast)


Lesenswert?

Wenn Karl Heinz mit seiner Aussage richtig liegt, dass die Variable
korrekt geändert wird, dann hast Du einen Fehler in Deiner Auswertung
oder ein Timing- bzw. Synchronisationsproblem.

von Karl heinz B. (kbucheg)


Lesenswert?

> Wenn Karl Heinz mit seiner Aussage richtig liegt

Ich kann nur sagen, was ich im Simulator gesehen habe.
Und dort siehts eigentlich gut aus.

> Du einen Fehler in Deiner Auswertung oder ein Timing- bzw.
> Synchronisationsproblem

Wäre eine Möglichkeit.

Ich würde mal mit 2 Leds debuggen. Die eine wird
eingeschaltet wenn im Interrupt die Umschaltung erfolgt,
die andere wenn in der dcf77_out das 1 Bit erkannt wird.

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