mikrocontroller.net

Forum: Compiler & IDEs Compilereinstellung für möglichst kompakten Code (gcc)


Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

meinem Atmel geht so langsam der Flash aus, bin mir aber nicht sicher ob 
der compilierte Code eventuell noch von mir nicht benötigte Infos 
beinhaltet (debuggen etc).

Ich würde gerne den Compiler dazu veranlassen möglichst kompaktesten 
Code zu erzeugen, kenne mich aber mit den Schaltern des Compilers im 
Makefile nicht aus.

Kann mir hier bitte jemand Hilfestellung geben, hab schon im Forum 
gesucht, bisher ohne Erfolg. Vielen dank schon mal!!!

Grüße
Chris

Autor: Juergen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-Os

Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ich poste mal den Abschnitt des Compilers aus "meinem" Makefile:

#---------------- Compiler Options ----------------
#  -g*:          generate debugging information
#  -O*:          optimization level
#  -f...:        tuning, see GCC manual and avr-libc documentation
#  -Wall...:     warning level
#  -Wa,...:      tell GCC to pass this to the assembler.
#    -adhlns...: create assembler listing
CFLAGS = -g$(DEBUG)
CFLAGS += $(CDEFS) $(CINCS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct 
-fshort-enums
CFLAGS += -Wall -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)

ich weiß damit nicht wirklich was anzufangen...brauche daher den 
Expertenrat! Was muss ich hier ändern, wo muss das -Os hin.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hättest das komplette Makefile posten sollen!
Irgendwo steht da bestimmt eine Zeile:
OPT=...
Die mußt Du ändern in:
OPT=s

CU

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Besemann wrote:
> Hallo zusammen,
>
> meinem Atmel geht so langsam der Flash aus, bin mir aber nicht sicher ob
> der compilierte Code eventuell noch von mir nicht benötigte Infos
> beinhaltet (debuggen etc).
Falls "nicht benötigte Infos" Funktionen oder globale/statische 
Variablen sind: vgl. Compileroptionen -ffunction-sections, 
-fdata-sections und Linker-Option -gc-sections(beim Linken über 
Frontend: -Wl,--gc-sections).

> Ich würde gerne den Compiler dazu veranlassen möglichst kompaktesten
> Code zu erzeugen, kenne mich aber mit den Schaltern des Compilers im
> Makefile nicht aus.
Erstmal das genannte -Os, weiter Tuningmäglichkeiten wurden hier schon 
mehrmals diskutiert, z.B. Beitrag "WinAVR 20080402"

> Kann mir hier bitte jemand Hilfestellung geben, hab schon im Forum
> gesucht, bisher ohne Erfolg.
vgl. z.B. o.g. Link

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Besemann wrote:
> Hallo zusammen,
>
> Ich würde gerne den Compiler dazu veranlassen möglichst kompaktesten
> Code zu erzeugen, kenne mich aber mit den Schaltern des Compilers im

Als Optionen kann man folgendes antesten:
-fno-tree-scev-cprop
-fno-split-wide-types
-fno-inline-small-functions
-fno-move-loop-invariants
-morder1

Für jede dieser Optionen sollte man separat testen, wie sie auf den 
jeweiligen Code wirkt, denn je nach Codestruktur kann sie eine 
Verkleinerung oder Vergrößerung bewirken.

-fno-split-wide-types hat weiterhin den Vorteil, daß mit ihr ein Bug in 
WinAVR-20090313 bzw. WinAVR-20081205 nicht zum Tragen kommt.

Die obigen -f Optionen sind für gcc 4.x (also auch für avr-gcc 4.x), die 
-m nur für avr-gcc.

Den kleinsten Code erhalte ich mit avr-gcc 3.4.6, allerdings hab ich 
noch nicht mit avr-gcc 4.4.0 oder avr-gcc 4.5 verglichen, nur gegen <= 
4.3.3

Um kleinen Code zu erhalten ist es ratsam, ein Review der Quelle 
durchzuführen, um Codefresser zu eliminieren. Dazu muss man natürlich 
den erzeugten Assembler-Code zu bewerten in der Lage sein und eine 
Vorstellung davon haben, wie guter gcc-Code aussieht.

Eine weitere Fingerübung in Makefile wäre es, jede Quelldatei mit 
mehreren Sätzen von gcc-Schaltern zu übersetzen, und nur das Objekt zu 
linken, das den kleinsten Code ergibt. Das hab ich mal für den Build 
eines Projektes durchgezogen. Die Build-Zeit geht natürlich linear mit 
der Anzahl der Schalterkombinationen nach oben. Allerdings war auch hier 
avr-gcc 3.4.6 konkurenzlos...

> meinem Atmel geht so langsam der Flash aus, bin mir aber nicht sicher ob
> der compilierte Code eventuell noch von mir nicht benötigte Infos
> beinhaltet (debuggen etc).

Beim Erstellen des hex-Files sollten nur Sections wie .text oder .eeprom 
eingehen, .stabs, .info, .debug etc. hat da nix zu suchen. SChau einfach 
auf der Kommandozile, welcher Optionen avr-objcopy mitbekommt, wenn es 
aus dem .elf (das alle Infos, also auch debug-Infos) enthält, das .hex 
erzeugt.

Johann

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> meinem Atmel geht so langsam der Flash aus, bin mir aber nicht sicher ob
> der compilierte Code eventuell noch von mir nicht benötigte Infos
> beinhaltet (debuggen etc).

Die erzeugten hex-Files ernthalten bei avr-gcc niemals Debuginfos. Diese 
stecken in zusätzlichen Dateien, die nicht in den Controller geladen 
werden.

Aber: der beste Optimizer bzw. größte Flashverschwender sitzt 
erfahrungsgemäß vor dem Computer...

Hast du deinen Code schonmal durchforstet, ob da alles wirklich so sein 
muß, wie es ist?

Und falls es sich um ein Hobbyprojekt in Stückzahl 1 handelt: Gibt es 
einen pincompatiblen AVR mit mehr FLASH?

Oliver

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver wrote:

> Die erzeugten hex-Files ernthalten bei avr-gcc niemals Debuginfos. Diese
> stecken in zusätzlichen Dateien, die nicht in den Controller geladen
> werden.

Das hängt einzig und alleine davon ab, wie ein hex-File erzeugt wird. Es 
kann ebenfalls debug-Informationen enthalten (die darin allerdings 
ziemlich sinnfrei sind), denn man sie vom .elf ins .hex übernimmt.

Johann

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. wrote:
> Das hängt einzig und alleine davon ab, wie ein hex-File erzeugt wird. Es
> kann ebenfalls debug-Informationen enthalten (die darin allerdings
> ziemlich sinnfrei sind), denn man sie vom .elf ins .hex übernimmt.
>
> Johann

Rein interessehalber, wie soll das gehen? Die Debug-Info selbst hat doch 
keine Adresse, auf welche Adresse wird sie dann im HEX File gelegt?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nichts was im hex-File landet hat von sich aus eine Adresse. Erst der 
Linker weist jedem Teil eine Adresse zu. Das kann er mit Programmcode 
genauso machen wie mit debug infos oder sonstigen Daten. Auch wenn wie 
erwähnt, diese Diskusion sinnfrei ist, weil debug infos im Controller 
ebend sinnfrei sind. ;)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nichts was im hex-File landet hat von sich aus eine Adresse. Erst der
>Linker weist jedem Teil eine Adresse zu.

http://de.wikipedia.org/wiki/Intel_HEX

Der Linker kommt lange vorher...

Oliver

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heißt, im elf-File hat alles schon seine Adressen und darauf werden 
dann einzelne Sectionen ins Hex-File übertragen? Dann schließe ich mich 
der Frage von  Bernhard M. (boregard) an ;)

Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn ich die Expertendiskussion kurz unterbrechen darf, vielen dank 
schon mal für die geleisteten Beiträge, das mit dem größten 
Flashverbraucher vor der Tastatur ignoriere ich mal ;-)) - allein proggt 
er sich nun mal nicht der Atmel....

Ja es ist ein Hobbyprojekt und ich könnt auf einen großen Bruder 
ausweichen, so will ich doch bei aller "Spielerei" auch was lernen - in 
diesem Fall über die Compilerschalter. Gibt es eine Doku / Beschreibung 
zu deren Verwendung?

Grüße Chris

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Besemann wrote:

> Ja es ist ein Hobbyprojekt und ich könnt auf einen großen Bruder
> ausweichen, so will ich doch bei aller "Spielerei" auch was lernen - in
> diesem Fall über die Compilerschalter. Gibt es eine Doku / Beschreibung
> zu deren Verwendung?
>
> Grüße Chris

Erste Hinweise erhält man per
avr-gcc -v --help

eine auf Optimierung gefilterte Ausgabe mit
avr-gcc --help=optimizers

Etwas mehr Prosa gibt's direkt bei gcc:
   http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Optimi...
wobei für avr nicht alles implementiert ist, zB bleibt 
-foptimize-sibling-calls ohne Wirkung, obwohl die Optimierung für avr 
machbar ist. Nur hat's eben noch keiner gemacht...

Letztendliche Klarheit liefern die Compiler-Quellen -- zumindest glaubt 
das Lieschen Müller...

Für die oben genannte -fsplit-wide-types wäre ein erster Anlaufpunkt 
dann
   http://gcc.gnu.org/viewcvs/tags/gcc_4_3_3_release/...

Johann

Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an die Beitragenden!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.