www.mikrocontroller.net

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


Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Harry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das einfach ohne Register aber mit volatile machen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.