Forum: Mikrocontroller und Digitale Elektronik Vergleich Präprozessor-Makro


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,

ich bin auf einem STM32 mit dem ARM-GCC. Ich will ein vordefiniertes 
Makro mit einem anderen vergleichen. Konkret in etwa so:

1
    #if( INPUT_CLK_GPIO == GPIOA )
2
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
3
    #else
4
        #error "Invalid/non-implemente GPIO for Clock input"
5
    #endif

Dabei ist definiert:
1
    #define INPUT_CLK_GPIO GPIOA
2
    #define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
3
    #define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
4
    u.s.w.

So funktioniert das nicht. Der Compiler/Präprozessor wirft mir vor: 
"error: operator '*' has no right operand". Den Teil verstehe ich schon 
einmal nicht. Nach der Präzprozessor-Orgie steht da ja etwas wie:
1
 struct{ ... } * 1234 == struct{ ... } * 1234
mit einer garantiert anderen Zahl.

Daher meine zwei (voneinander unabhängigen) Fragen:

 a) Wie kann ich dem Präprozessor beibringen, zur prüfen, ob die beiden 
Makros (also die Zeiger) äquivalent sind und

 b) Wie kommt der Compiler bei diesem Konstrukt von oben auf die 
Fehlermeldung?

Viele Grüße
W.T.

von (prx) A. K. (prx)


Lesenswert?

Walter T. schrieb:
>     #if( INPUT_CLK_GPIO == GPIOA )

Der Präprozessor kennt nur numerische Vergleiche.

von Dr. Sommer (Gast)


Lesenswert?

Mach doch ganz einfach
1
if (INPUT_CLK_GPIO == GPIOA)
Der Compiler ist schlau genug das ggf. wegzuoptimieren.

von Walter T. (nicolas)


Lesenswert?

Dr. Sommer schrieb:
> Mach doch ganz einfachif (INPUT_CLK_GPIO == GPIOA)Der Compiler ist
> schlau genug das ggf. wegzuoptimieren.

Das ist er. Ich bekomme nur im nicht-erfüllten Fall keinen Fehler zur 
Compilezeit, sondern kann nur einen Laufzeit-Fehler mit error() 
implementieren.

von Dr. Sommer (Gast)


Lesenswert?

Dann füge noch ein static_assert(INPUT_CLK_GPIO == GPIOA); hinzu.
Alternativ so:
1
#define INPUT_CLK_GPIO GPIOA
2
#define INPUT_CLK_BUS RCC_APB2Periph_GPIOA
3
4
RCC_APB2PeriphClockCmd (INPUT_CLK_BUS, ENABLE);

Dann kannst du an zentraler Stelle Port und zugehörigen Takt einstellen. 
Nicht besonders schön, aber so ist das nunmal wenn man unbedingt C und 
kein böses OOP verwenden möchte :-)

von Walter T. (nicolas)


Lesenswert?

Dr. Sommer schrieb:
> Dann kannst du an zentraler Stelle Port und zugehörigen Takt einstellen.

Ja, das ist meine "Notlösung".

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.