2

Ich arbeite gerade mit embedded C für einen Mikrocontroller und finde, dass es manchmal mehrere Peripheriegeräte gibt, die sich nur durch einen Buchstaben unterscheiden (zB UARTA, UARTB, etc). Der Code für jedes Peripheriegerät ist oft identisch mit Ausnahme der Beschriftung ansonsten identischer Register. Zum Beispiel der Einrichtung würde periphere AI so etwas wie:Gibt es eine Compiler - Anweisung, um einen Teil einer Konstanten zu ersetzen?

UCA2CTL1 |= UCSWRST;      // Put state machine in reset 
UCA2CTL0 |= UCSYNC+UCCKPL+UCMSB;   // 3-pin, 8-bit SPI slave 
// Continue initializing peripheral registers with "A" in name 

Und die Einrichtung peripherer BI haben genau den gleichen Code, mit der Ausnahme, dass die Registernamen von 1 Brief umgesetzt werden:

UCB2CTL1 |= UCSWRST;      // Put state machine in reset 
UCB2CTL0 |= UCSYNC+UCCKPL+UCMSB;   // 3-pin, 8-bit SPI slave 
// Continue initializing peripheral registers with "B" in name 

Ich mag die Fähigkeit haben, zu ändern, welches Peripheriegerät ich anvisiere, ohne # ifdef/copy/paste code oder find/replace zu haben. Gibt es eine Compiler-Direktive oder einen cleveren Trick, der dieses Verhalten implementiert, so dass ich den Code nur einmal schreiben muss? Ich würde gerne nur den letzten Buchstaben in der Peripherie definieren, aber so etwas scheint mir gefährlich zu werden.

+3

Gibt es einen Grund, warum Sie hier nicht einfach ein oder zwei Makros verwenden können? – thelazydeveloper

+0

@thelazydeveloper - Ich würde gerne, darum bitte ich hier. –

+0

Sie sind eigentlich besser dran, dies NICHT zu tun. Betrachten Sie "Grep UCB2CTL1 *", um zu sehen, warum. –

Antwort

3

Wird dies für Sie funktionieren?

#define INITUC(device) \ 
UC## device ## 2CTL1 |= UCSWRST; \ 
UC## device ## 2CTL0 |= UCSYNC+UCCKPL+UCMSB 
... 
INITUC(A); 
INITUC(B); 
1

diese Konstanten Unter der Annahme sind const und nicht defines Sie können so etwas tun:

#define MAKECONST(X) const int X ## 1; \ 
        const int X ## 0; \ 
        X ## 1 |= UCSWRST; \ 
        X ## 0 |= UCSYNC+UCCKPL+UCMSB; 

Und dann:

MAKECONST(UCA2CTL) 
MAKECONST(UCB2CTL) 

Beachten Sie, dass mein Beispiel Erklärung enthält, die ich weiß nicht, ob Sie müssen, wenn nicht, die ersten zwei Zeilen des Define auslassen. Zum Beispiel:

#define SETUP(X) X ## 1 |= UCSWRST; \ 
       X ## 0 |= UCSYNC+UCCKPL+UCMSB;