Optimizer Unterschiede mit GCC - Codevision - IAR

OP #2516012
Lesenswert?

Hi da.

Habe ab und an das Problem das mein WinAVR z.B. if/then Konstrukte weg 
optimiert obwohl er es nicht sollte.
Beispiel habe ich gerade nicht zur Hand, da keine Zeit um einen Code so 
umzuschreiben das es veröffentlichbar und zugleich ersichtlich ist.

Ich denke das Problem hatten schon einige das plötzlich was nicht mehr 
funktionierte und ein Zweig nicht mehr assembliert wurde.

Da es mich so langsam nervt irgendwelche Funktionen in einzelne .c 
Dateien zu extrahieren die ich nicht optimieren lasse suche ich derzeit 
nach einer Lösung für das Problem.

Wie sieht es denn bei Codevision oder IAR in dem Falle aus?
Funktioniert es da besser?

Evtl. kann das ja jemand beantworten.

Gruß Björn
Gast #2516016
Lesenswert?

Du schiebst da etwas auf einen Compilerfehler was du 99.9% dein Fehler 
ist.
Wenn sich das Verhalten deines Programms wegen der Optimierung ändert 
sind das entweder Timingprobleme, Nachlässigkeit mit volatile oder Stack 
oder Heap-Speicher-Schweinereien.
If/else wird nicht wegoptimiert, wenn es nicht wegoptimiert werden kann.
Gast #2516030
Lesenswert?

Björn G. schrieb:
> Da es mich so langsam nervt irgendwelche Funktionen in einzelne .c
> Dateien zu extrahieren die ich nicht optimieren lasse suche ich derzeit
> nach einer Lösung für das Problem.

Du solltest in dem "wegoptimierten" Zweig halt auch etwas tun, was 
Einfluß auf die weitere Programmausführung hat.
#2516041
Lesenswert?

Björn G. schrieb:
> Da es mich so langsam nervt irgendwelche Funktionen in einzelne .c
> Dateien zu extrahieren die ich nicht optimieren lasse suche ich derzeit
> nach einer Lösung für das Problem.

Die Lösung ist, herauszufinden, welchen Fehler du machst und ihn zu 
beheben. Der Compiler optimiert nicht einfach so Sachen weg, die 
benötigt werden.

> Wie sieht es denn bei Codevision oder IAR in dem Falle aus?
> Funktioniert es da besser?

Es funktioniert auch bei GCC sehr gut, daher liegt die Vermutung nahe, 
daß du etwas falsch machst. Ohne ein Beispiel wird dir aber keiner sagen 
können, was der konkrete Fehler ist.
Persönliche Seite #2516345
Lesenswert?

Björn G. schrieb:

> Wie sieht es denn bei Codevision oder IAR in dem Falle aus?
> Funktioniert es da besser?

Vielleicht funktioniert den Code damit weil diese Compiler weniger 
optimieren. Aber dadurch wird dein Code nicht korrekt: Du verschiebst 
das Problem nur nach hinten anstatt es zu lösen.

Löse das Problem, um es los zu werden. Verschiebe es nicht an eine 
andere Stelle.

> Evtl. kann das ja jemand beantworten.

Beachte Warnungen des Compilers und schreibe robusten Code.

Was zählt, ist der Code, der ausgeführt wird und nicht der Code, den 
irgendein Debugger anzeigt oder nicht anzeig, siehe [[Compilerfehler#Die 
häufigsten Nicht-Fehler]].

Mir ist kein Fehler im WinAVR bekannt, der zur kompletten, unerlaubten 
Entfernung eines if-else Zweiges führt.

Ist der Code wirklich weg? Oder wird er nur nicht ausgeführt? Mit Code 
meine ich auch Code und nicht irgendne mehr oder weniger sinnfreie 
Debugger-Ansicht.
#2522447
Lesenswert?

Björn G. schrieb:
> Hi da.
>
> Habe ab und an das Problem das mein WinAVR z.B. if/then Konstrukte weg
> optimiert obwohl er es nicht sollte.
> Beispiel habe ich gerade nicht zur Hand, da keine Zeit um einen Code so
> umzuschreiben das es veröffentlichbar und zugleich ersichtlich ist.

Um die Beiträge der anderen mal etwas deutlicher auszudrücken:

Bring und ein Beispiel bei dem das wirklich der Fall ist, damit der 
Fehler im Compiler ausgemerzt werden kann - bedenke dabei, die 
angesprochenen Punkte: Dein Code muss natürlich (nach C-Standard) auch 
das tun können, was du von ihm verlangst...
#2522695
Lesenswert?

Björn G. schrieb:
> Ich denke das Problem hatten schon einige das plötzlich was nicht mehr
> funktionierte und ein Zweig nicht mehr assembliert wurde.

Ja, das passiert schonmal.

In der Regel ist das dann ein logischer Fehler, z.B. ein Ausdruck ist 
immer wahr oder immer falsch.

Also einfach nochmal den wegoptimierten Teil gründlich anschauen, dann 
merkt man schnell seinen Fehler. Z.B. ein | an einer Stelle, wo ein & 
hin sollte.

Ich nutze das manchmal sogar aus, um Code zeitweise zu löschen.
1
if( 1 | ... )
entfernt den Test und führt den if-Zweig immer aus (der else-Zweig wird 
auch gelöscht).
Bzw. umgekehrt:
1
if( 0 & ... )

Das fehlende volatile löscht den Code auch nur dann, wenn das 
Verschieben vor die Schleife immer wahr bzw. immer falsch ergibt.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren