mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik static Variable in C Funktion


Autor: Robert K. (molch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...?

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifdef INCLUDE_MY_FUNCTION
void my_function () {
  static char my_var [500];
}
#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.

Autor: Robert K. (molch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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>

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robert K. (molch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: 12er Dude (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Robert K.

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

Lösung: Library

Tschü Dude

Autor: Robert K. (molch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke.

Hab ich noch nich gemacht aber kann ja nicht so viel schwerer sein.

Grüße

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.