Hallo zusammen,
ich verwende Eclipse, AVR-Toolchain mit WinAVR-20100110
Ich habe hier ein Projekt, das über defines einmal mit und einmal ohne
Fernbedienungsfunktion kompiliert werden kann.
Ohne Fernbedienungsfunktionen sollte das Ergebnis locker in einen
ATMEGA48 passen. Die Optionen -ffunction-sections -fdata-sections für
den Compiler sind gesetzt und werden auch verwendet.
Leider werden nicht alle unnötigen Funktionen entfernt, weil ich nicht
in der Lage bin die Option --gc-sections an die korrekte Stelle für den
Linker einzutragen.
Kann mir da jemand Hilfestellung geben?
Gruss
Frank
Hallo zusammen,
habs gerade selber gefunden.
Es muss der komplette Text: -Wl,--gc-sections unter AVR-Linker - General
- Other Arguments eingetragen werden.
Gruss
Frank
Frank Link schrieb:> Ich habe hier ein Projekt, das über defines einmal mit und einmal ohne> Fernbedienungsfunktion kompiliert werden kann.
Warum schmeißt du dann die ohne Fernbedienungsfunktion nicht nötigen
Funktionen nicht gleich mittels #ifdef auch mit raus?
Manchmal fragt man sich schon, wie es Generationen von C-Programmierern
geschafft haben, solche Sachen ohne Krimskrams wie function sections
und "garbage collection" hinzubekommen.
Hallo Jörg,
genau das mache ich ja. Es gibt ein #define WITH_FB wird dieses #define
auskommentiert, sind alle Teile im Quellcode, die in irgendeiner Weise
mit den Fernbedienungsfunktionen in Verbindung stehen entfernt. Trotzdem
ist das Ergebnis immer noch über 5,4 KB groß.
Mit #ifdef entferne ich allerdings nur die Headerdateien und die Teile
des Quellcodes, der innerhalb meiner eigenen Routinen Funktionen aus den
ausgeklammerten c-Dateien aufruft.
Hier mal ein Auszug aus meinen Quellen:
1
#include<stdlib.h>
2
#include<avr/interrupt.h>
3
4
#include"define.h"
5
6
#ifdef DEBUG
7
#include"base.h"
8
#include"uart.h"
9
#endif
10
11
#include"timer.h"
12
#include"user.h"
13
#include"TLC5940.h"
14
15
#ifdef WITH_FB
16
#include"irmp.h"
17
#include"wceeprom.h"
18
#endif
19
20
intmain(void)
21
{
22
#ifdef DEBUG
23
uart_init();
24
#endif
25
26
#ifdef WITH_FB
27
wcEeprom_init();
28
#endif
29
30
cli();
31
color_init();
32
TLC5940_init(12);
33
34
#ifdef WITH_FB
35
irmp_init();
36
timer_init();
37
user_init();
38
#endif
39
sei();
40
41
while(1)
42
{
43
#ifdef WITH_FB
44
autoleaveMenuMode();
45
handle_ir_code();
46
#endif
47
handle_leds();
48
}
49
return0;
50
}
Ich verwende in meinen Sourcen IRMP. Gehe ich jetzt hin und entferne in
IRMP verschiedene Protokolle wird das ganze kleiner.
Durch den Einsatz der zusätzlichen Optionen ist das Ergebnis mit
auskommentierten #define WITH_FB ca. 1,7 KB groß und unter Verwendung
von #define WITH_FB 6,9 KB groß.
Jetzt stellt sich für mich halt die Frage wieso?
Gruß
Frank
Frank Link schrieb:> Mit #ifdef entferne ich allerdings nur die Headerdateien und die Teile> des Quellcodes, der innerhalb meiner eigenen Routinen Funktionen aus den> ausgeklammerten c-Dateien aufruft.
Du musst das #ifdef natürlich auch in den C-Dateien selbst drin
haben, also nicht nur die Aufrufe entfernen, sondern auch das
heraus-"ifdefen", was dann nicht mehr aufgerufen wird.
Lediglich bei Bibliotheken würde der Linker nur die Module (nicht
Funktionen) linken, die tatsächlich referenziert werden. Alle
Objektmodule, die der Linker auf der Kommandozeile außerhalb von
Bibliotheken vorgesetzt bekommt, linkt er immer komplett, denn das
ist ihm ja mit der Kommandozeile so gesagt worden.
Alles klar, soweit hatte ich das auch aus anderen Threads heraus gelesen
und verstanden. Das würde bedeuten, dass ich z.B. in der irmp.c ein
#define WITH_FB um den kompletten Quellcode setzen müsste, um genau das
zu erreichen.
Ist es da nicht einfacher, mit den zusätzlichen Optionen zu arbeiten, da
dies dann automatisch erfolgt? Aus meiner Sicht werden damit Folgefehler
vermieden. Oder gibt es einen anderen Grund, auf diese Optionen zu
verzichten? Mal abgesehen davon, dass sie irgendwann vielleicht
wegfallen könnten.
Gruß
Frank
Frank Link schrieb:> Das würde bedeuten, dass ich z.B. in der irmp.c ein> #define WITH_FB um den kompletten Quellcode setzen müsste, um genau das> zu erreichen.
Richtig.
> Ist es da nicht einfacher, mit den zusätzlichen Optionen zu arbeiten, da> dies dann automatisch erfolgt? Aus meiner Sicht werden damit Folgefehler> vermieden. Oder gibt es einen anderen Grund, auf diese Optionen zu> verzichten?
Mag sein, dass ich altmodisch bin, aber ich bin der Meinung, dass man
als Programmierer den Überblick behalten sollte und einfach wissen
sollte, in welcher Konfiguration welche Codeteile wirklich benötigt
werden. Wenn man diesen Überblick aber hat, dann gibt's doch keinen
Grund, dem Compiler die nicht benötigten Dinge überhaupt erst zum
Fraß vorzuwerfen.
(Der wesentliche Grund, warum --gc-sections und -ffunction-sections
wohl überhaupt so weit gekommen sind, ist meiner Erinnerung nach, dass
der Compiler bei C++ zum Teil formal gezwungen ist, bestimmte Dinge
wie Konstruktoren zu generieren, da er selbst noch nicht wissen kann,
ob sie überhaupt jemals benötigt werden.)
Hallo Jörg,
das mit dem altmodisch, kann ich voll nachvollziehen, nach fast 30
Jahren Softwareentwicklung habe ich da auch so meine Marotten :-)
Bei mir ist es leider eher selten, dass ich mit c arbeite, von daher
habe ich da ab und an kleinere oder auch größere Verständnisprobleme.
Bei mir hat sich eine zweischneidige Denkweise eingebürgert. Routinen,
die nicht von mir sind und nachgewiesener Maßen das tun, was ich
erwarte, ändere ich nur ungern. Auf der anderen Seite, will ich das Rad
auch nicht neu erfinden und verwende dort wo es geht Bibliotheken, die
nicht von mir sind. Gerade im Mikrocontrollerbereich, wo ich vielen der
hier Anwesenden nicht das Wasser reichen kann und will. Auch habe ich
teilweise nicht das Verständnis bzw. den Willen jede einzelne Zeile zu
verstehen zu müssen.
Von daher sind mir diese Optionen lieber, weil ich nur in meinen Quellen
die Änderungen vornehmen muss und mir über die Quellen anderer
zumindestens an dieser Stelle keine Gedanken machen muss.
Leider bleibt meine eigentliche Frage: "Wo kann man diese Optionen
generell für alle Projekte in Eclipse eintragen" unbeantwortet. Kannst
Du mir auch an dieser Stelle noch den entscheidenden Tipp geben?
Gruß
Frank
[EDIT] In Bezug auf die Optionen und C++ hast Du Recht. So hatte ich es
auch im INet gefunden.
Frank Link schrieb:> Kannst> Du mir auch an dieser Stelle noch den entscheidenden Tipp geben?
Nein, leider nicht, Eclipse ist mir zu schwerfällig. Ich benutze
einfach Emacs für alles und schreibe meine Makefiles selbst. ;-)