Hallo. Ich bin dabei vom Imagecraft MSP430 Compiler zu GCC umzusteigen. Dazu habe ich ein bereits lauffähiges Projekt umgestellt und mit Elcipse und MSPGCC compiliert. Mit GCC bekomme ich nun die Meldung, dass anscheinend der Codebereich meiner CPU überschritten ist. Bei Imagecraft war das aber kein Problem. Meine Fragen sind jetzt: 1. Kann man die irgendwie die Information bekommen wieviel Platz man brauchen würde (ohne für eine andere CPU zu kompiliere)? Also gibt es eine Linkeroption die das trotz Fehler anzeigt ? 2. Könnte es sein, dass beim Linken mehr aus System-Libraries genommen wird, als man eigentlich braucht ? Gibt es eine Linkeroption die das verhindert wenn es so wäre? Danke sehr. Gruss
Vielleicht hat der MSPGCC ähnliches: ------------------- AVR-GCC * Mit dem Tool avr-nm erhält man eine Übersicht über die Platzausnutzung in der erzeugten ELF-Datei bzw. dem damit gefüllten AVR. Das Tool wird per Kommandozeile mit avr-nm --size-sort --print-size <name of your ELF file> aufgerufen. Alle Symbole mit einem "T" (globale Funktionen), "t" (statische Funktionen) und letztlich auch mit einem "D" oder "d" (globale bzw. statische Daten, die haben ihre Initialisierungswerte im ROM) betreffen das FLASH-ROM. "B" und "b" brauchen ausschließlich RAM (werden beim Start mit 0 initialisiert). Die erste Spalte ist die Adresse des Symbols, die zweite ist die Größe (beides hexadezimal). (nach Forenbeitrag von Jörg Wunsch) * Mit dem Tool avr-size erhält man eine Übersicht über den Platzbedarf in den text, data und bss Sektionen innerhalb der ELF Binärdatei. Die Sektionen text und data benötigen Platz im FLASH-ROM und die Sektionen data und bss benötigen zur Laufzeit Platz im SRAM.
Dito: -------------------- http://www.mikrocontroller.net/articles/AVR-GCC-Codeoptimierung#Unbenutzte_Funktionen_und.2Foder_Variablen_entfernen Unbenutzte Funktionen und/oder Variablen entfernen F: Mir ist aufgefallen, dass der Linker nicht benutzte Funktionen trotzdem mit linkt und Speicherplatz belegt. Gibt es eine Möglichkeit diese Funktionen automatisch weg zu lassen? A: Dem GNU Linker sagt man mit --gc-sections, dass er unbenutzte Sektionen rauswirft. Mit --print-gc-sections listet er die rausgeworfenen auch auf. Dem GCC kann man mit -ffunction-sections sagen, dass er jede Funktion in eine eigene Sektion legt, damit funktioniert das auch unterhalb der Ebene einer Quellcodedatei (also eine Funktion rausschmeissen obwohl fünf andere in derselben Datei gebraucht werden). Mit der Option -fdata-sections geht das auch für statische Variablen (Forumsbeitrag von Andreas B.). Vorsicht: Je nach Implementierung der Interruptsprung- bzw. Vektorleiste kann es dazu führen, dass alle eigenen Interrupt-Handler ebenfalls wegoptimiert werden. Dies passiert dann, wenn es im Code keinen Verweis (typisch: Ermittlung der Adresse zum Eintrag in eine Interrupt-Vektortabelle oder in Hardwareregister eines Interrupt-Controllers) auf die Handler-Funktion gibt oder die Funktion, in der der Verweis auf eine ISR enthalten ist, nie aufgerufen wird. In solchen Fällen kann es notwendig sein, die Handler mit __attribute__((used)) zu versehen. Bei Verwendung der Makros aus der avr-libc (in WinAVR enthalten, z.B. ISR()) ist dies nicht erforderlich, da das Attribut bereits in den Makro-Definitionen enthalten ist (avr-libc/interrupt.h/ __INTR_ATTRS). In manch anderer Umgebung, wie bei einigen Quellcodes für ARM-basierte Controller, ist das Attribut jedoch zu ergänzen.
Danke für die Hinweise. Aber ... ... msp430-size usw. ist mir bekannt, nur soweit komme ich gar nicht, dass ein elf File erzeugt wird. ... die optionen --gc-sections und --print-gc-sections werden vom Linker ignoriert. Gibt auch keine Fehlermedlung. Mach ich da was falsch ? Bin für jeden Tip dankbar. Danke. Gruss
> ... die optionen --gc-sections und --print-gc-sections werden > vom Linker ignoriert. Gibt auch keine Fehlermedlung. > Mach ich da was falsch ? Weiss ich nicht, ich sehe ja nicht, was du machst. Linkoptionen (http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html) übergibt man beim GCC mit -------------------- -Wl,option Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas. You can use this syntax to pass an argument to the option. For example, `-Wl,-Map,output.map' passes `-Map output.map' to the linker. When using the GNU linker, you can also get the same effect with `-Wl,-Map=output.map'. -------------------- In diesem Fall also: *-gcc ... -Wl,--gc-sections -Wl,--print-gc-sections ...
Hatte noch MSPGCC V3 installiert, diese Version kennt das anscheinedn noch nicht. Jetzt mit MSPGCC V4 werden die Linker Funktionen akzeptiert, allerdings zu gut. Das elf File ist leer. Muss wohl an der Ecke mal weiterschauen. Danke jedenfalls für den Tip. Gruss
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.