Forum: Compiler & IDEs Problem mit leerer "do.while." Warteschleife


von Harry (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

"volatile register" funktioniert nicht.  Du brauchst aber zwingend
ein "volatile", damit der Optimierer weiß, dass die Variable von
außerhalb des aktuellen Kontexts geändert werden kann.

von Harry (Gast)


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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich würde das einfach ohne Register aber mit volatile machen.

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.