Optimizer Unterschiede mit GCC - Codevision - IAR

OP #2516012
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
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
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
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
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.
Gast #2516388
Björn G. schrieb:
> Habe ab und an das Problem das mein WinAVR z.B. if/then Konstrukte weg
> optimiert obwohl er es nicht sollte.

Was ist denn "dein" WinAVR?

Ansonsten wurde schon alles gesagt. avr-gcc optimiert keine 
if/the-Konstrukte weg, die nachweislich durchlaufen werden müssen, um 
das zu tun, was im Programm steht. Punkt.

Oliver
#2522447
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...
Gast #2522511
Björn G. schrieb:
> Wie sieht es denn bei Codevision oder IAR in dem Falle aus?

Um das auch noch zu beantworten: Wenn du von diesen die kommerzielle 
Version gekauft hast, dann kannst du solche Fragen dem dortigen Support 
stellen. Die beantworten das dann professionell ;)

Oliver
#2522695
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.