Allg. Frage zum Optimierer

Gast #1693972
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 ?
#1693994
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.
#1694005
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.
Gast #1694069
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...
Gast #1694091
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 ?
Persönliche Seite #1694266
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.
#1694530
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
#1694609
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%
Gast #1694629
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.

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