Forum: Compiler & IDEs MSPGCC: msp430-ld: region text is full


von Max (Gast)


Lesenswert?

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

von Helfer (Gast)


Lesenswert?

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.

von Helfer (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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

von Helfer (Gast)


Lesenswert?

> ... 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 ...

von Max (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.