Forum: Compiler & IDEs Allg. Frage zum Optimierer


von Sash (Gast)


Lesenswert?

Hallo,

ich hab eine Frage zum Optimierer for ACR-GCC und Atmel programmierung:

Wenn ich ein Programm habe das ohne Optimierer in den Flash-Speicher 
passt und auch nicht auf Laufzeit optimiert sein muss, ist es dann 
trotzdem ratsam den Optimierer einzuschalten oder eher nicht ?

von Klaus W. (mfgkw)


Lesenswert?

Es ist dann weder ratsam, zu optimieren, noch nicht zu optimieren.
Es ist schlichtweg egal.

von (prx) A. K. (prx)


Lesenswert?

Es ist trotzdem ratsam, denn wenn man ein Programm nie mit Optimizer 
probiert hat, dann ist die Überraschung gross, wenn man nach 2 Jahren 
und der soundsovielsten Erweiterung die nun endlich nicht mehr 
unoptimiert reinpasst nochmal beim Debugging von vorne anfangen muss um 
die ganzen fehlenden volatiles zu finden.

von Klaus W. (mfgkw)


Lesenswert?

Wer volatiles weglässt...

von (prx) A. K. (prx)


Lesenswert?

...findet sich dann hier im Forum wieder. Massenhaft. Schlimmer als die 
"defekten" Pins vom Port C des Mega16/32.

Aber auch an anderen Stellen kann man Schiffbruch erleiden. 
Beispielsweise weil die "__delay_xx" Schleifchen erst mit Optimierung 
ihre wahre Kunst entfalten.

von Sven (Gast)


Lesenswert?

Wenn du z.B. per JTAG debuggst (lol.. denglisch) dann ist es manchmal 
echt merkwürdig, wenn der Optimierer an ist. Dann kommt es zu 
anscheinend unsinnigen Sprüngen, oder Variablen, die du z.B. zum 
debuggen eingefügt hast, fehlen einfach...

von Sash (Gast)


Lesenswert?

Vielen Dank für die Antworten ! Ich werde das Programm mit und ohne 
Optimierer in allen Funktionen testen, dann bin ich für zukünftige 
Erweiterungen flexibel.

Das sich ein optimiertes Programm nicht so schön debuggen lässt ist mir 
auch mit ISP aufgefallen, nicht nur mit JTAG. Manche Breakpoints lassen 
sich nicht setzen z.B. .... liegt vielleicht daran, dass der Optimierer 
diese Stellen optimiert hat and deshalb in der betroffenen Zeile kein 
Breakpoint mehr stehen kann ?

von Klaus W. (mfgkw)


Lesenswert?

Sash schrieb:
> Ich werde das Programm mit und ohne
> Optimierer in allen Funktionen testen,

Das ist sicher eine gute Idee.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sash schrieb:

> Wenn ich ein Programm habe das ohne Optimierer in den Flash-Speicher
> passt und auch nicht auf Laufzeit optimiert sein muss, ist es dann
> trotzdem ratsam den Optimierer einzuschalten oder eher nicht ?

Es muss auch sichergestellt sein, daß das RAM ausreicht.

Ohne Optimierung legt gcc lokale Variablen auf dem Stapel ab, was flott 
zu merklichem (dynamischem) RAM-Verbrauch führen kann. Weil der 
Verbrauch dynamisch ist -- also erst zur Laufzeit entsteht -- ist er nur 
schwer statisch schätzbar und Tools wie avr-size helfen überhaupt nicht 
dabei.

Man sollte also eine ungefähre Vorstellung davon haben, wie viel RAM 
maximal belegt wird -- das gilt natürlich auch dann, wenn man optimieren 
lässt.

gcc kennt die Optimierungsstufe -O1, die optimiert und dabei halbwegs 
debugbare Programme erzeugt.

von Andreas F. (aferber)


Lesenswert?

Häufig kann man den Optimizer zum Debugging mittels Inline-Assembler 
auch gezielt an einzelnen Stellen am Optimieren hindern.

Beispiel:
1
i += 20;
2
asm("" : "=m" (i) : "m" (i));
3
i += 30;

Der Inline-Assembler verhindert, dass der Compiler die beiden Additionen 
zusammenfassen kann, da die Variable ja im Assemblercode verändert 
werden könnte. Ausserdem sorgt die Zuweisung der Variablen an 
Memory-Operanden dafür, dass der Compiler die Variable tatsächlich im 
Speicher anlegen muss.

Sehr nützlich, wenn man aufgrund der Rahmenbedingungen nicht komplett 
auf die Compileroptimierung verzichten kann.

Andreas

von Link zu (Gast)


Lesenswert?

A. K. schrieb:
> ...findet sich dann hier im Forum wieder. Massenhaft. Schlimmer als die
> "defekten" Pins vom Port C des Mega16/32.
Aus Neugier:
Was meinst du damit?
Hat das was mit JTAG zutun?

von Karl H. (kbuchegg)


Lesenswert?

Link zu schrieb:
> A. K. schrieb:
>> ...findet sich dann hier im Forum wieder. Massenhaft. Schlimmer als die
>> "defekten" Pins vom Port C des Mega16/32.
> Aus Neugier:
> Was meinst du damit?
> Hat das was mit JTAG zutun?

Standardfrage:
Hilfe, mein <Gerät hier einsetzen, meistens ein LCD> funktioniert nicht.
Ich habe es am Port C angeschlossen.

Standardantwort (noch ehe der Frager den Code präsentiert):
JTAG am Port C abschalten

Trefferquote, das man richtig liegt: >90%

von Link zu (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Link zu schrieb:
>> A. K. schrieb:
>>> ...findet sich dann hier im Forum wieder. Massenhaft. Schlimmer als die
>>> "defekten" Pins vom Port C des Mega16/32.
>> Aus Neugier:
>> Was meinst du damit?
>> Hat das was mit JTAG zutun?
> Standardfrage:
> Hilfe, mein <Gerät hier einsetzen, meistens ein LCD> funktioniert nicht.
> Ich habe es am Port C angeschlossen.
> Standardantwort (noch ehe der Frager den Code präsentiert):
> JTAG am Port C abschalten
> Trefferquote, das man richtig liegt: >90%
Ach so, danke.
Irgendetwas in der Richtung habe ich erwartet.

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.