Forum: Mikrocontroller und Digitale Elektronik Compiler löscht Code


von Dominik K. (zergi)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Warst du ziemlich sparsam mit dem volatile schlüsselwort?

von Peter (Gast)


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.

von (prx) A. K. (prx)


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".

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von spacedog (Gast)


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'.

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.