Forum: Mikrocontroller und Digitale Elektronik gcc vs. mbed online (ARM compiler v5)


von Jojo S. (Gast)


Lesenswert?

Ich habe ein Cortex-M3 Testprojekt im mbed compiler, das enthält ein 
printf() und das FatFS von ChaN. Der mbed Online Compiler erzeugt 27,9 
kB Code, der gcc 4.9.3 macht aus dem gleichen Projekt 38 kB, also über 
10 kB mehr. Optimierung steht auf -Os, -O3 erzeugt gleich viel und 
kleine Optimierungen noch mehr. Kann das sein das der online Compiler 
(soll ein ARM compiler Version 5 sein) soviel besser optimiert? Oder 
gibt es weitere Optimierungsschalter im gcc die man zusätzlich zu -Ox 
setzen muss?
Wenn ich das Projekt nur mit einem SPI Ojekt erzeugt statt dem 
Filesystem verringert sich die Grösse auf 18,5 kB, laut 
http://elm-chan.org/fsw/ff/en/appnote.html sollte der Code für einen 
Cortex-M3 10,6 kB gross sein, da liege ich also auch deutlich drüber.

von Nase (Gast)


Lesenswert?

Wie bewertest du denn die Code-Größe?
Hoffentlich nicht am erzeugten ELF.

von Jojo S. (Gast)


Lesenswert?

Die size vom text segment. Der Keil µVision erzeugt ca. 35 kB, also auch 
eine ganze Ecke mehr als der ARM.

von Jim M. (turboj)


Lesenswert?

Beim GCC wird normalerweise newlib als C Library verlinkt, die ist nicht 
besonders klein. Aber schau mal in die Doku, eventuell ist auch newlib 
in der nano version dabei, die ist deutlich kleiner (aber auch langsamer 
und mit weniger Features IIRC).

von Jojo S. (Gast)


Lesenswert?

Die NewlibNano ist auch eingestellt. Aber wo ich das gerade kontrolliert 
habe sehe ich das ich noch 'printf float support' aktiviert habe. Ohne 
bin ich jetzt bei 30,6 kB.

Nachtrag:
habe ein float in den Code reingepackt und im printf übergeben. Der Code 
im Online compiler wird nicht grösser, bleibt bei 27,9 kB.

von Nase (Gast)


Lesenswert?

Dann zieh doch einfach mal ein map-File aus beiden ELF raus und 
vergleiche mal, was da an Symbolen so drinnesteckt.

von Jojo S. (Gast)


Lesenswert?

vom Online compiler bekomme ich kein mapfile, nur ein bin was direkt in 
den Controller geladen wird. Das gcc mapfile habe ich schonmal 
durchgesehen, das ist aber mühselig viel, jedenfalls nichts sehr 
auffäliges.

von Pascal (Gast)


Lesenswert?

Eine Variante zur Codeverkleinerung beim GCC ist noch die linker time 
Optimierung einzuschalten...

von Jojo S. (Gast)


Lesenswert?

War auch an, aber gerade teste ich die Option zur Lebervergrösserung.

von Dr. Sommer (Gast)


Lesenswert?


von Horst (Gast)


Lesenswert?

-ffunction-sections -fdata-sections fürs Compilen und -Wl,-gc-sections 
fürn Linker an?

von W.S. (Gast)


Lesenswert?

Jojo S. schrieb:
> Der mbed Online Compiler erzeugt 27,9
> kB Code, der gcc 4.9.3 macht aus dem gleichen Projekt 38 kB,

Nimms leicht, es ist eben so. Der GCC hat noch nie besonders kompakten 
Code erzeugt.

W.S.

von Jojo S. (Gast)


Lesenswert?

habe mich gerade durch langen von Dr. Sommer verlinkten Thread gekämpft. 
Die genannten Optimierungen waren schon eingeschaltet, auch die lto. Ich 
finde nur den Unterschied von ca. 30 % recht drastisch, auch wenn die 
Meinungen über die Optimierungsqualität vom gcc auseinander gehen.

von Paul (Gast)


Lesenswert?

GCC optimiert für ARM wirklich nicht gut, 30% plus kommt gut hin. Aber 
sei froh, dass du keinen M0 benutzt, da sieht's teilweise noch 
schlechter aus.

von Nase (Gast)


Lesenswert?

W.S. schrieb:
> Nimms leicht, es ist eben so. Der GCC hat noch nie besonders kompakten
> Code erzeugt.
Und Pauschalisierungen sind grundsätzlich verkehrt.

von Jojo S. (Gast)


Lesenswert?

Paul schrieb:
> Aber
> sei froh, dass du keinen M0 benutzt, da sieht's teilweise noch
> schlechter aus.

Stimmt, da kommt die Frage auch ursprünglich her, ich spiele aber gerade 
wieder mit meinem LPC1347 und habe versucht das da nachzuvollziehen.

http://developer.mbed.org/questions/61916/LPC1114FN28-mbed-online-vs-LPCXpresso/

Da gab es jetzt noch eine Aufklärung zum ARM-CC, ist wohl identisch mit 
dem Keil. Ich habe die freie Version 5 mit dem 32k Limit, der (nicht) 
erzeugte Code lag bei 35 kB. Mit den am Ende genannten Optimierungen 
schrumpft der Code wie im Online Compiler auf ca. 28 kB. Die Mühe mit 
der 4er Version habe ich mir nicht gemacht, das Projekt wurde auch vom 
5er ohne Fehler kompiliert. Nur die Microlib erzeugt ein paar undefined 
symbols, die habe ich auch wieder abgeschaltet, da könnte man also noch 
mehr sparen.

Gut das der LPC1347 64 kB Flash hat, da kann ich noch ein bisschen beim 
gcc bleiben.

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.