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
Nochmals eine Frage dazu, wo kann man diese Optionen eintragen, damit sie für alle Projekte automatisch 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 | int main( 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 | return 0; |
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. ;-)
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.