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?
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.
Was ist denn Slight Optimization (welcher -O Schalter)? Allgemein: Variablen von Interrupts müssen im Main als volatile gecastet werden. Peter
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.
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
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.
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
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
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.
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!
Ah ok, so war das gemeint, danke für den Tipp! liebe grüße markus
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.