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
Warst du ziemlich sparsam mit dem volatile schlüsselwort?
Gast
#1901392
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.
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".
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...
Gast
#1901398
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
Bitte melde dich an, um einen Beitrag zu schreiben.