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.
Wie bewertest du denn die Code-Größe? Hoffentlich nicht am erzeugten ELF.
Die size vom text segment. Der Keil µVision erzeugt ca. 35 kB, also auch eine ganze Ecke mehr als der ARM.
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).
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.
Dann zieh doch einfach mal ein map-File aus beiden ELF raus und vergleiche mal, was da an Symbolen so drinnesteckt.
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.
Eine Variante zur Codeverkleinerung beim GCC ist noch die linker time Optimierung einzuschalten...
War auch an, aber gerade teste ich die Option zur Lebervergrösserung.
-ffunction-sections -fdata-sections fürs Compilen und -Wl,-gc-sections fürn Linker an?
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.
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.
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.
W.S. schrieb: > Nimms leicht, es ist eben so. Der GCC hat noch nie besonders kompakten > Code erzeugt. Und Pauschalisierungen sind grundsätzlich verkehrt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.