PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : static inline ? warum static



Siro
22.12.2010, 12:20
Hallo zusammen, ich habe vermutlich mal wieder etwas in "C" nicht richtig verstanden.

ich habe folgende Definitionen in einer originalen Datei von NXP gefunden:

static inline void __enable_irq() { asm volatile ("cpsie i"); }
static inline void __disable_irq() { asm volatile ("cpsid i"); }

Vom Verständnis her kein Problem. es gibt eine Unterfunktion __enable_irq , welche keinen Parameter benötigt. Der Programmcode selbst ist in Assembler codiert. Das reservierte Wort "inline", welches es erst ab der Erweiterung in C99 gibt, zwingt den Compiler dazu, keinen Unterprogrammaufruf zu tätigen, sondern den Code jeweils direkt einzusetzen. Soweit alles klar. "volatile" ist wahrscheinlich, vorsichtshalber angegeben worden, damit der Compiler nix wegoptimiert. (Reine Vermutung von mir) Aber wozu noch "static" Bei Variablen wäre es eine zur Laufzeit immer verfügbare Variable. Es handelt sich aber nicht um eine Variable sondern um eine Funktion und hierbei wäre, meiner Meinung nach, die Bedeutung "nur in diesem Modul verfügbar". Was bewirkt die Angabe "static" in diesem Falle ?

Übrigens habe ich es in meiner Software bisher wie folgt gelöst:
#define DISABLE __asm("CPSID I") /* Disable Interrupts */
#define ENABLE __asm("CPSIE I") /* Enable Interrupts */

und das funktioniert auch einwandfrei, zumindest mit dem IAR Compiler.

Danke Euch vorab,
mfg. Siro

Besserwessi
22.12.2010, 12:52
Das Static hier schon die Auswirkung nur in diesem Modul verfügbar.

Da auch Zugriffe von außen keine Rücksicht genommen werden muss, reicht es immer den inline Code zu nutzen.
Ohne das Static würde in dem Modul inline Genutzt werden, aber zusätzlich noch eine normale Funktion angelegt damit auch die Benutzung aus anderen Modulen möglich ist.

Die auf den ersten Blick verschiedenen Auswirkungen von static kriegt man unter einen Hut, wenn man es so sieht:
Mit "static" wird dem Compiler gesagt feste Speicher Adressen zu nutzen, also gerade nicht über den Linker zu gehen. Dadurch können andere Module nicht darauf zugreifen, und Variablen bleiben dauerhaft auch über mehrmalige Unterprogrammaufrufe.

Das damit eine bessere Optimierung möglich ist, ist vermutlich nicht mal Teil des C Standards, aber wohl nur üblich. Das Inline ist soweit ich weiss auch nur als Empfehlung für den Compiler zu sehen.

Siro
22.12.2010, 14:41
Ich glaube ich habe es verstanden:
ohne dem "static" würde der Compiler also eine zusätzliche Funktion im Speicher anlegen, in welcher sich der eigentliche inline code befindet. Diese Funktion könnte dann von anderen Modulen aus mit einem call aufgerufen werden. Während er innerhalb des Moduls den direkten inline code einsetzt. Das würde Sinn ergeben.
Danke Dir