mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Compiler löscht Code


Autor: Dominik K. (zergi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab ein Programm geschrieben was einen Flankenwechsel und 
gleichbleiben des Signals erkennt.
Nun dachte ich mir weiter, das ich jetzt mittels Timer gesteuerten 
Tastverhältnisses ein Signal auslesen kann.

Im Debugmodus und unoptimiert geht das auch.
Sobald ich die Optimierung einschalte löscht er mir Reihe 2-11 & 13.
Er springt also von der erste IF-Anweisung direkt zu leds_off();

Der Rest des Programms funktioniert, nur das nach dem Optimieren die 
Reihenfolge des Programms ziemlich durcheinander gewürfelt ist.


Kann mir jemand erklären warum das so ist? Das Durchwürfeln und das 
löschen?

Gibt es eine Möglichkeit dem Compiler das Wegrationalisieren von Code zu 
verbieten?


1 if(go == 0 && fall == 1)
2  go = 1;
3 else if(go == 1 && down == 1)
4  go = 2;
5 else if(go == 2 && down == 2)
6  go = 3;
7 else if(go == 3 && rise == 1)
8  go = 4;
9 else if(go == 4 && up == 1)
10  {
11  leds_on();
12  leds_off();
13  go = 0;
14  }


mfg
Dominik

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warst du ziemlich sparsam mit dem volatile schlüsselwort?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der Optimierer schmeist nur code weg, wenn er der meinung ist das er 
nicht gebraucht wird.
Zeit mal die komplette quelle damit man auch sieht wo die variabel noch 
verwendet/gesetzt werden.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Codeausschnitt reicht für die Beurteilung nicht aus. Wichtig ist, 
in welchem Kontext "go" steht, gesetzt und verändert wird, wie es 
deklariert ist. Offensichtlich ist der Compiler der Ansicht, es wäre 
konstant.

Ins Blaue geraten: "go" wird im Interrupt gesetzt, ist aber nicht 
"volatile".

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dominik K. schrieb:
> Gibt es eine Möglichkeit dem Compiler das Wegrationalisieren von Code zu
> verbieten?
Ja, man kann die Optimierung abschalten...

> Sobald ich die Optimierung einschalte löscht er mir Reihe 2-11 & 13.
Wie meinen?
Welcher Compiler?
Welcher uC?

> Kann mir jemand erklären warum das so ist?
Sicher. Aber das Problem liegt vermutlich nicht in den hier geposteten 
Zeilen. Zeig doch mal deinen ganzen Code...

Autor: spacedog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dominik K. schrieb:
> 11  leds_on();
> 12  leds_off();

Läuft zu schnell ab um wahrgenommen zu werden.

> fall, down, rise, up

Werden in einer Interruptroutine verändert, was der Compiler nicht 
weiss. Stichwort 'volatile'.

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.