Hi, folgendes "Problem": Ich habe eine Funktion innerhalb einer C-Datei die mit statischen Variablen arbeitet (static). Der Compiler/Linker (ICCAVR von Imagecraft) reserviert jetzt für diese statischen Variablen Speicher (im Mapfile angegeben) (soweit logisch da das static ihn ja dazu anweist die Variable zu Programmbeginn zu initialisieren). Mich ärgert daran, dass er dies tut obwohl die Funktion im Programm nicht aufgerufen wird. Ist das compilerseitig abschaltbar, so dass die statischen Variablen aus Funktionen die nicht aufgerufen werden auch nicht im RAM vorgesehen werden? Oder ist das durch einen C-Standard so vorgeschrieben und bei Verwendung von static dann halt einfach so? Wie könnte man dieses Problem progammiertechnisch besser meistern? Dazu könnte ich diese Variablen über Parameter realisieren die ich dann ja nur anlegen brauche wenn die Funktion benötigt wird was ich vermeiden möchte. Was fällt euch dazu ein? Bitte unterbreitet mir jetzt nicht den Vorschlag einfach die eh unbenutzte Funktion aus der Datei zu entfernen, denn dann wäre die inkludierte Datei ja wieder abhängig vom Projekt und das ist ungewünscht ;-) Danke, MfG Robert
Also bei der GCC kann man das einstellen. Dann werden unbenutzte Routinen rausgeworfen, einschließlich der Variablen... theoretisch zumindest, d.h., wenn da kein Bug ist :-) Sonst kommts wie immer drauf an. Natürlich kannste beim Aufruf nen Zeiger mitgeben. Muss es überhaupt statisch sein...?
Du könntest die statische Variable durch einen Pointer ersetzen, der mit 0 initialisiert wird, und beim 1. Aufrufen wird mit malloc Speicher angefordert und der Pointer darauf gesetzt. Du könntest aber auch mit #define's arbeiten:
1 | #ifdef INCLUDE_MY_FUNCTION
|
2 | void my_function () { |
3 | static char my_var [500]; |
4 | }
|
5 | #endif
|
Wenn du die Funktion dann haben willst, kannst du den Compiler mit "-DINCLUDE_MY_FUNCTION" aufrufen. Oder du lagerst die Funktion in eine eigene Datei aus, die nur dann mit-gelinkt wird, wenn man die Funktion haben will.
Danke für die Vorschläge. Sven P. wrote: > Sonst kommts wie immer drauf an. Natürlich kannste beim Aufruf nen > Zeiger mitgeben. Muss es überhaupt statisch sein...? Jop, ich denke schon das es statisch sein muss. Brauch gewisse Werte beim Wiedereintritt in die Funktion. Wenn der GCC das kann muss ich mal daheim schauen ob ich die Einstellung finde, klingt erstmal positiv. @ Niklas G. Das mit dem Zeiger klingt interessant, dem geh ich mal genauer nach. Die Variante über defines wollt ich nicht verwenden, zu faul immer die entsprechenden Flags zu setzen :P Aber sonst eine saubere Sache. Extra Datei möcht ich dafür auch nicht nutzen.
Es ist Aufgabe des LINKERS, nicht benutze Funktionen und Variablen zu erkennen und evtl. wegzulassen. Also die Linker Optionen hierzu durchsehen. Der Fachbegriff hierzu nennt sich "deadstripping" oder "dead stripping".
Hallo, es stellt sich die Frage: Wieso gibt es innerhalb eines Moduln (c file) Funktionen die nicht aufgerufen werden? So etwas lagert man aus. Also eigene Moduln, die nur bei Bedarf dem Projekt zugefügt und damit gelinkt werden. Oder man fasst solche Funktionen in einer Library zusammen und erhält so den gewünschten Automatismus. Zur Not hilft auch bedingte Compilierung. Diese Möglichkeiten sind Compiler unabhängig. Tschü Dude
<Pedanterie> Das Modul. Plural: Module. (Betonung auf 'u') ist eine Baugruppe, ein Teil von etwas Der Modul, Plural: Moduln (Betonung auf 'o') ist ein Teilungsverhältnis, wie es beispielsweise bei Zahnrädern auftritt. </Pedanterie> Modernere Linker können auf Funktionsebene linken, ältere linken nur auf Modulebene. Das klassische Standardverhalten ist, daß alle Module, die explizit angegeben werden, gelinkt werden, auch, wenn diese gar nicht verwendet werden. Ein Linken nach Bedarf ist hier mit Libraries möglich, hier werden aus der Library nur die benötigten Module entnommen.
Klaus wrote: > Es ist Aufgabe des LINKERS, nicht benutze Funktionen und Variablen zu > erkennen und evtl. wegzulassen. <Klugscheiß-Modus> Nur zum Verständnis: GCC ist nicht der GNU-C-Compiler :-) </Klugscheiß-Modus>
Wenn schon Klugscheiß-Modus, dann gleich noch mehr: Daß die Funktion gar nicht aufgerufen wird, reicht nicht unbedingt, um sie weglassen zu können (manuell oder automatisch durch einen intelligenten Linker). Steht beispielsweise ein Aufruf in einem if-Zweig, der nie ausgeführt wird, kann die Funktion nicht weggelassen werden. Ebenfalls wenn man sie in einem Ausdruck anspricht und dadurch ihre Adresse bekommt. Aus dem OP sehe ich jetzt nicht, ob nur durch den Programmfluß kein Aufruf erfolgt, oder ob die Funktion wirklich überflüssig ist.
Es handelt sich um eine Funktion die inhaltlich zum Bedienen der UART da ist und damit im uart.c eingeordnet wurde. Da ich aber nicht in jedem Projekt jede Funktion davon brauche aber sie auch nicht in ein extra Modul auslagern will habe ich gefragt :-) Sie wird aber nirgends aufgerufen, lediglich im .h und .c File deklariert bzw. definiert.
Hallo,
@Robert K.
> ... nicht in ein extra Modul auslagern will ...
Lösung: Library
Tschü Dude
Danke. Hab ich noch nich gemacht aber kann ja nicht so viel schwerer sein. Grüße
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.