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
"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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.