Forum: Mikrocontroller und Digitale Elektronik Makro in c (IAR)


von Manuella (Gast)


Lesenswert?

Hallo,
ich habe mich immer gefreut hier meine Frage zu stellen und ich habe 
fast immer eine Antwort bekommen.
ich habe den folgende Code Teil gefunden aber leider nicht genau 
verstanden, wofür bracht man so ein Makro und welsche Vorteil hat er. 
was bedeutet diese befehle.

 N.B __root,__no_init.

Makro:

#define Item(Type, Str) typedef Type X_##Str##_n; __root __no_init 
static Type INT_##Str##_n @ "Variabl"; _Pragma("diag_suppress=Pe10") 
__root __no_init static Type Y_##Str##_k @ "Variabl" 
_Pragma("diag_default=Pe10");

Danke

von Frank (Gast)


Lesenswert?

Mit dem Makro werden 3 Datentypen mit unterschiedlichen Eigenschaften 
deklariert.
Und zwar mit dem Typ "Type".
"Str" dient dazu den Typen einen eindeutigen Namen zu verpassen.

Die Typen unterscheiden sich dann z.B ob sie oder ob sie nicht ( 
__no_init) initialisiert werden oder ob sie auch weg optimiert werden 
dürfen (__root).

von Planlos (Gast)


Lesenswert?

Google "IVR _no_init _root" :

_no_init: Compiler initialisiert Variable nicht (wird sonst bei 
Programmstart mit 0 initialisiert)

_root: Compiler(eher Linker) darf beim Optimieren die Variable nicht 
entfernen, auch wenn sie ungenutzt ist.

Manuella schrieb:
> wofür bracht man so ein Makro

Hier: Zwei Variablen auf einmal deklarieren

Manuella schrieb:
> welche Vorteil hat er

Tipparbeit sparen, und nicht jeder muss über _no_init und _root bescheid 
wissen. Es reicht, wenn sich der Makro-Schreiberling auskennt, und die 
Verwendung seines Makros dokumentiert.

von Manuella (Gast)


Lesenswert?

Hallo,
vielen dank für die schnelle Antwort
ok das habe ich verstanden.
aber was bedeutet das.
static Type INT_##Str##_n @ "Variabl"; _Pragma("diag_suppress=Pe10")
__root __no_init static Type Y_##Str##_k @ "Variabl"
_Pragma("diag_default=Pe10");
eigentlich alles sollte in eine Zeile dargestellt worden.
alles gehört zu den makro.

von Tom (Gast)


Lesenswert?

1
Item(float, Fooo)
2
3
// wird mit dem gcc-Preprozessor (habe kein IAR) zu 
4
5
typedef float X_Fooo_n; 
6
7
__root __no_init static float INT_Fooo_n @ "Variabl";
8
9
#pragma diag_suppress=Pe10
10
__root __no_init static float Y_Fooo_k @ "Variabl"
11
#pragma diag_default=Pe10
12
;

Was __root und __no_init bedeutet, wurde erwähnt, das @ steht in der 
IAR-Doku:
https://www.iar.com/support/tech-notes/compiler/linker-error-for-absolute-located-variable/

Wozu man den typedef und die Variablen namens INT_Fooo_n und Y_Fooo_k 
braucht, hat der Ersteller dieses wunderschönen Makros hoffentlich 
dokumentiert.

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.