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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.