Hallo zusammen, ich bin gerade dabei, den Webserver von U. Radig so zu modifizieren, dass er mit einer von mir dafür abgeänderten Version von efsl (embedded file systems library) läuft und Webseiten von SD_Krate anzeigt. Ich mache daraus ein Projekt für AVR-Studio, d.h. ich habe alle notwendigen Files bereits importiert und efsl benutze ich nicht als Bibliothek, sondern direkt den Quellcode. Nun bin ich gerade an einer merkwürdigen Sache dran. Damit der Code möglichst klein wird, habe ich einige Optimierungen im Compiler, unter anderem -ffunction-sections -fdata-sections Im Linker entsprechend -Wl,--relax -Wl,--gc-sections Den folgenden Thread habe ich schon dazu gelesen: Beitrag "AVR-GCC Kompiliert nicht benutzte Funktionen mit ein" Nun erwarte ich, dass unbenutzte Funktionen nicht mehr gelinkt werden. Das ist auch so, aber es wird trotzdem noch RAM dafür reserviert. Warum? Speziell möchte ich die ganzen #define use_... aus dem Webserver ausbauen, ich finde es viel praktischer, die nicht benutzten Funktionen einfach nicht aufzurufen, als sie immer speziell per define aus dem Projekt auszuschließen. Das funktioniert auch, aber es wird Ram dafür verbraucht. wol.c (Wake on Lan) habe ich jetzt z.B. im Projekt, rufe aber nichts davon auf. Wenn ich es per #define vom Compilierungsvorgang ausschließe, benötigt das ganze am Ende 4 Byte weniger Ram. Die Codegröße ändert sich aber nicht. Diese 4Byte entsprechen aber auch nicht den in wol.c deklarierten Variablen, die würden viel mehr Speicher benötigen. Kennt jemand eine Option, mit der der Linker auch den zusätzlichen Ram-Verbrauch verhindert? Grüße, Peter
Vergleich doch mal die .lss-files der beiden Versionen, um rauszufinden, was da die zusätzlichen 4 bytes belegt. >ich finde es viel praktischer, die nicht benutzten Funktionen >einfach nicht aufzurufen, als sie immer speziell per define aus dem >Projekt auszuschließen. Na ja, ich finde es viel praktischer, schon vorhandene und nachgewiesenermaßen funktionierende Verfahren zu benutzen. Was hast du gegen #defines? Oliver
Es ist einfach so, dass ich mir nicht immer bei Änderungen überlegen möchte, welche Module dafür genau benötigt werden und welche nicht. Alle verwendeten müsste ich immer per #define einbauen. Dafür sind die Optimierungen im Linker ja da, dass unbenutze Teile nicht mitgelinkt werden. Beim Webserver ist das auch nicht so kritisch, aber bei dem Filesystem gibt es eine Menge an Funktionen, die ich nie aufrufe aber auch nicht per #define auskommentieren möchte. Natürlich kann man nicht global sagen, dass diese Vorgehensweise vorteilhaft ist und es ist auch nicht sicher, dass ich es so lasse. Trotzdem interessiert es mich, woher der zusätzliche Speicherbedarf kommt. Das mit den lss files ist etwas kompliziert bei diesem großen Projekt, ich werde mir bei Gelegenheit mal ein Minimalbeispiel konstruieren, an dem man den Effekt erkennen kann. Grüße, Peter
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.