Problem mit leerer "do.while." Warteschleife

Gast #1512838
Lesenswert?

Hallo zusammen,

ich habe eine Software, die mit WinAVR aus 2006 compilliert wurde und 
problemlos läuft. Mit WinAVR-20090313 lässt sie nicht mehr lauffähig 
übersetzen.

Es handelt sich um folgenden Codeschnipsel:
----------------------------------------------------
Deklaration:
register u16 MesswNeu2Kanal_u16     asm("r2");
----------------------------------------------------
Codeschnipsel, der darauf wartet, dass die Variable im Interrupt 
verändert wird:
do
  {
  }
while (0 == MesswNeu2Kanal_u16);
----------------------------------------------------
Im AVR Simulator hängt sich die Software hier weg:

+00000235:   2823        OR      R2,R3            Logical OR
+00000236:   F009        BREQ    PC+0x02          Branch if equal
+00000237:   CFFF        RJMP    PC-0x0000        Relative jump
+00000238:   CFFF        RJMP    PC-0x0000        Relative jump

Gibt es bekanntermaßen Probleme mit solch leeren Schleifen? Zeile 237 
und 238 sind doch wohl ein komplettes Aufhängen der Software?

Optimierung ist auf S, eine 0 hilft hier aber auch nicht. Ein volatile 
vor der Variablen hilft auch nicht.


Und so sieht das läuffähige mit WinAVR-20060421 aus:

+0000026A:   0143        MOVW    R8,R6            Copy register pair
1254:        }
+0000026B:   1421        CP      R2,R1            Compare
+0000026C:   0431        CPC     R3,R1            Compare with carry
+0000026D:   F3E9        BREQ    PC-0x02          Branch if equal


Viele Grüße
Harry
Gast #1512884
Lesenswert?

Ich hatte folgende Deklaration probiert:

volatile register u16 MesswNeu2Kanal_u16     asm("r2");

...und dann folgende Compilerwarnung übersehen:

"../../main.c:87: warning: volatile register variables don't work as you 
might wish
"

Wer lesen kann, ist klar im Vorteil.
Danke für den Tipp!

Viele Grüße
Harry

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren