Forum: Compiler & IDEs GCC: -ffunction-sections verändert Programmlogik - warum?


von Marcel W. (Gast)


Lesenswert?

Eine Frage zur Wegoptimierung von ungenutzten Funktionen durch den 
Linker:

Ich wollte die Optimierung zum Entfernen von unbenutzten Funktionen
aktivieren (vgl. 
http://www.mikrocontroller.net/articles/GCC:_unbenutzte_Funktionen_entfernen)

Auf dem ATXMEGA256A3 hat sich die Codegröße danach von 150kByte auf 
120kByte
verringert. Ich bin über die 20% Reduktion erstaunt, da ich nicht 
meinte, dass so viele Funktionen ungenutzt sind. Die Firmware läuft aber 
nach der Optimierung nicht mehr richtig, das Verhalten ist gestört. Eine 
kurze Überprüfung hat ergeben, dass das main() und (oberflächlich 
angeschaute) ISRs noch da sind und auch angesprungen werden. Hat jemand 
eine Idee oder eine ähnliche Situation im Hinterkopf oder gibt es 
vielleicht ein bekanntes Problem?

Danke Euch schon im Vorraus
Marcel

von huch (Gast)


Lesenswert?

"Weiterhin ist darauf zu achten, dass der Linker den Startup-Code und 
die Interrupt-Vektoren nicht verwirft."

Hast Du das beachtet?

Bei Fragen, die Compiler/Linker betreffen, ist es sinnvoll die Version 
anzugeben.

Siehe http://www.mikrocontroller.net/articles/Netiquette

von Peter D. (peda)


Lesenswert?

Bei agressiver Optimierung ist zu beachten, daß alle Zugriffe vom Main 
auf Interruptvariablen grundsätzlich als volatile erfolgen müssen.

Sonst werden Zugriffe gnadenlos wegoptimiert oder aus der Schleife 
herausgezogen.

Hier mal ein Beispiel:
Beitrag "mehrere MC seriell über Datenbus verbinden (1Draht)"


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Bei agressiver Optimierung ist zu beachten, daß alle Zugriffe vom Main
> auf Interruptvariablen grundsätzlich als volatile erfolgen müssen.

Das sollte sich aber zwischen -ffunction-sections/--gc-sections
und normaler Optimierung nicht unterscheiden.

Nein Marcel, sorry fürs Noch-nicht-Beantworten der Mail, ich habe
da auch keine Idee, ohne dass man den Kram komplett analysiert.

von Georg A. (Gast)


Lesenswert?

> Ich bin über die 20% Reduktion erstaunt, da ich nicht
> meinte, dass so viele Funktionen ungenutzt sind.

Schau doch mal das Endergebnis mit nm an nd ob da Funktionen fehlen, von 
denen du sicher bist, dass sie eigentlich aufgerufen werden müssen.

> Die Firmware läuft aber nach der Optimierung nicht mehr richtig,
> das Verhalten ist gestört.

Könnte daran liegen, dass möglicherweise einige Funktionen jetzt nicht 
mehr inline aufgerufen werden und damit mehr Stack gebraucht wird und 
sich das Timing natürlich auch etwas ändert. Aber alles nur geraten...

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.