Forum: Mikrocontroller und Digitale Elektronik lib_AT91SAM7 von IAR __inline


von Karl Z. (griffin27)


Lesenswert?

hallo,

ihre kennt sicherlich die "library" von IAR.
darin werden inline-funktionen definiert, um einem das programmieren 
etwas zu erleichtern.

mein problem ist nun, dass in jedem programm.c, in dem diese library 
(bei mir konkret lib_AT91SAM7A3.h) includiert wird, die ganzen inline 
funktionen in den maschinen code kommen, obwohl ich nur einige wenige 
davon benötige.

ich dachte mir immer, inline funktionen werden vor dem kompilieren 
einfach an die stelle eingesetzt. der vorteil von inline ist ja, dass es 
keinen unterprogrammaufruf gibt. daher sehr schnell. andererseits, wird 
der code an jede stelle jedes aufrufes kopiert. daher, wenn man die 
funktion oft braucht, entsteht viel maschinen code.

ich arbeite mit Rowly CrossWorks for ARM V1.5., verwende aber die 
includes von IAR.
muss ich da dem linker irgendwas beibringen, dass er die 
inlinefunktionen weglässt?

bei EINER C-datei ist es ja nicht DIE tragik, ist halt der code etwas 
größer... aber wenn ich zB 3 C-datein habe, kommt es zu 
definitions-konflikten, da jedes objectfile die inline-funktionen 
definiert hat...

ich hoffe mir kann da jemand weiterhelfen.

lg, karl

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mach sie static inline statt einfach nur inline.

von Karl Z. (griffin27)


Lesenswert?

ich bin entzückt!!! es funktioniert!!

jörg, kannst du mir noch kurz erklären, wo nun der unterschied ist 
zwischen STATIC INLINE und INLINE??

vielen dank,
karl

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nun, bei "inline" wird, wie du schon festgestellt hast, noch eine
explizite Kopie der Funktion angelegt.  Das hängt damit zusammen, dass
die Funktion external linkage hat und dass inline in C eine Art
Empfehlung ist, die der Compiler berücksichtigen darf aber nicht muss.
Es ist daher völlig legales C, dass man von so einer Funktion die
Adresse nimmt und irgendwohin zuweist.  Da der Compiler infolge der
external linkage nicht wissen kann, ob nicht irgendein anderer Modul
letztlich die Adresse der Funktion doch noch benötigt, ist er
gezwungen, die zusätzliche Kopie anzulegen.

Bei static inline ändert sich das Bild, da die Funktion nunmehr für
jeden Modul ("translation unit") nur noch file scope besitzt, der
Compiler folglich verfolgen kann, ob die extra Kopie der Funktion
überhaupt benötigt wird.  Damit kann diese Kopie in der Regel
weggelassen werden.  Aber selbst wenn diese Kopie benötigt wird,
garantiert der durch "static" erzeugte file scope, dass die Funktionen
gleichen Namens aus zwei verschiedenen Modulen am Ende nicht
miteinander kollidieren, sondern eben einfach zweimal da sind.

von Karl Z. (griffin27)


Lesenswert?

ich glaub, dass ich es so halbwegs verstanden habe.

vielen dank nochmals.

<thread closed>

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.