Forum: Compiler & IDEs Slight Optimization oder Size Optimizations


von Markus (Gast)


Lesenswert?

Ich habe jetzt meinen Atmega644 COntroller mit 20 MHz betrieben, und die 
Size Optimizations eingestellt. Da hat man aber nichts brauchbares am 
Display gesehen. Als ich auf Slight Optimization gewechselt habe, sehe 
ich schon mehr.
Wieso ändert das etwas, weil die Programmgröße ist bei beiden gut 
undoptimiert, jedoch verstehe ich nicht wieso es beim einen geht und 
beim anderen nicht.
Kann mich jemand aufklären?

von (prx) A. K. (prx)


Lesenswert?

Markus schrieb:

> Kann mich jemand aufklären?

Du hast Code geschrieben, der abhängig von der Optimierung seine 
gedachte Funktion nicht mehr erfüllt. Beispielsweise Zeitschleifen, die 
mit Optimierung nicht mehr (oder nicht lang genug) warten.

von Peter D. (peda)


Lesenswert?

Was ist denn Slight Optimization (welcher -O Schalter)?

Allgemein:
Variablen von Interrupts müssen im Main als volatile gecastet werden.


Peter

von Klaus W. (mfgkw)


Lesenswert?

Peter Dannegger schrieb:
> Variablen von Interrupts müssen im Main als volatile gecastet werden.

Wie kommen Variablen vom Interrupt nach Main?

Globale Variablen? Die werden dann aber nicht im Main und nicht im
Rhein als volatile deklariert, sondern außerhalb an Land,
z.B. vor allen Funktionen.

Ich vermute, wir denken an dasselbe, aber dann ist die Formulierung
für Anfänger vielleicht etwas verwirrend.

von Oliver (Gast)


Lesenswert?

Markus schrieb:
> Da hat man aber nichts brauchbares am
> Display gesehen.

Timingprobleme bei der Initialisierung und/oder beim der Ausgabe. 
Optimierter Code läuft halt schneller.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Nicht nur das.
Es gibt noch viele andere Dinge.
Allen gemeinsam ist aber, dass der Programmierer irgendetwas nicht 
C-Standardkonform geschrieben hat, und der Compiler seine Rechte 
ausgenutzt hat um den Code zu verändern. Und dabei ist es dann passiert: 
Der Programmierer hat eine C-Regel verletzt oder nicht bedacht (meist 
aus Unwissenheit), und der Compiler hat diesen Fauxpas benutzt um eine 
Optimierung durchzuführen, die kontraproduktiv war.

Der Fehler liegt also nicht im Compiler sondern in den meisten Fällen im 
fehlenden Wissen des Programmierers.

von Peter D. (peda)


Lesenswert?

Klaus Wachtler schrieb:
> Wie kommen Variablen vom Interrupt nach Main?
> Globale Variablen?

Hatte ich vorausgesetzt.
Soweit ich weiß, geht das nur über globale Variablen.


Klaus Wachtler schrieb:
> Die werden dann aber nicht im Main und nicht im
> Rhein als volatile deklariert, sondern außerhalb an Land,
> z.B. vor allen Funktionen.

Das kann im Interrupt aber teuer werden. Deshalb bevorzuge ich das 
Casten.


Peter

von Peter D. (peda)


Lesenswert?

Oliver schrieb:
> Timingprobleme bei der Initialisierung und/oder beim der Ausgabe.
> Optimierter Code läuft halt schneller.

Stimmt.
Insbesondere wenn man denkt, Tasten Entprellen sei nicht nötig, das 
macht sich durch die Laufzeit ganz von alleine.


Peter

von Markus (Gast)


Lesenswert?

Die Frage war eigentlich warum es mit Slight Optimierung funktioniert 
und mit Size nicht, obwohl beide brauchbaren gut optimierten Code 
liefern. Ca 30% weniger.

PS: Ich weiß was volatile ist und wie es anzuwenden ist.

Danke bisher.

von Karl H. (kbuchegg)


Lesenswert?

Markus schrieb:
> Die Frage war eigentlich warum es mit Slight Optimierung funktioniert
> und mit Size nicht,

Und die Antwort ist immer noch dieselbe:
Weil du irgendwo ein Schlupfloch offen gelassen hast oder etgegen den 
C-Regeln programmiert hast, was der Optimizer des Compilers in dem einen 
Fall ausgenutzt hat und im anderen Fall nicht.

Das Problem steckt in deinem C-Code und nicht im Compiler!

von Markus (Gast)


Lesenswert?

Ah ok, so war das gemeint, danke für den Tipp!

liebe grüße markus

von Peter D. (peda)


Lesenswert?

Markus schrieb:
> Die Frage war eigentlich warum es mit Slight Optimierung funktioniert
> und mit Size nicht, obwohl beide brauchbaren gut optimierten Code
> liefern. Ca 30% weniger.

Dazu müßte man erstmal wissen, was Du mit "Slight Optimization" meinst.
Im GCC-Manual "3.10 Options That Control Optimization" steht diese 
Option jedenfalls nicht.

Ich kenne nur -Os und -O0 .. -O3.


Peter

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.