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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.