mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik while bedingung wegobtimiert


Autor: lucian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich komme langsam zum verzweifeln mit dem optimierungen -Os bei winavr 
gcc mit AVRSTUDIO.

folgende while schleife mit TIMEOUT funktion wartet auf das BIT in PINC 
und der sys.wait_timer wird innerhalb einer interrupt routine 
heruntergezählt.

sys.wait_timer = 4;

while (((!(PINC & 0b00000100)) && (sys.wait_timer > 0) ));
while ((PINC & 0b00000100));


winavr gcc optimiert einfach den term (sys.wait_timer > 0) weg, damit 
bleibt die schleife hängen.

kann das einer erklären, wie kann man das umgehen?

142:          sys.wait_timer = 4;
+000006E1:   E084        LDI     R24,0x04         Load immediate
+000006E2:   E090        LDI     R25,0x00         Load immediate
+000006E3:   939003B2    STS     0x03B2,R25       Store direct to data 
space
+000006E5:   938003B1    STS     0x03B1,R24       Store direct to data 
space
144:          while (((!(PINC & 0b00000100)) && (sys.wait_timer > 0) ));
+000006E7:   9B32        SBIS    0x06,2           Skip if bit in I/O 
register set
+000006E8:   CFFE        RJMP    PC-0x0001        Relative jump
145:              while ((PINC & 0b00000100));
+000006E9:   9932        SBIC    0x06,2           Skip if bit in I/O 
register cleared
+000006EA:   CFFE        RJMP    PC-0x0001        Relative jump
+000006EB:   9508        RET                      Subroutine return

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach sys.wait_timer volatile

Autor: Ralph Broeder (ralph-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei 142: setzt du den sys.wait_timer = 4 und willst ihn 4 
Assemblerzeilen später auf >0 abfragen. Da zwischen den beiden punkten 
keine Änderung eintritt, ist die Bedingung immer erfüllt.

Ohne Volatile hält der Compiler diesen Wert im Register und optimiert 
die Bedingung weg.

Durch Volatile muss der Compiler den Wert der Variablen sys.wait_timer 
für den Vergleich neu einlesen und kann dadurch den Vergleich nicht 
wegoptimieren.

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.