Forum: Mikrocontroller und Digitale Elektronik static Variable in C Funktion


von Robert K. (molch) Benutzerseite


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Robert K. (molch) Benutzerseite


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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

von 12er Dude (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

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>

von Klaus W. (mfgkw)


Lesenswert?

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.

von Robert K. (molch) Benutzerseite


Lesenswert?

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.

von 12er Dude (Gast)


Lesenswert?

Hallo,

@Robert K.

> ... nicht in ein extra Modul auslagern will ...

Lösung: Library

Tschü Dude

von Robert K. (molch) Benutzerseite


Lesenswert?

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