2

私は現在、マイクロコントローラ用の組み込み C を使用していますが、文字が 1 つだけ異なるペリフェラルがいくつかある場合があります (たとえば、UARTA、UARTB など)。各ペリフェラルのコードは、他の点では同一のレジスタの文字を除いて、多くの場合同一です。たとえば、周辺 AI をセットアップするには、次のようにします。

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

また、ペリフェラル BI をセットアップするには、レジスタ名が 1 文字だけ置き換えられていることを除いて、まったく同じコードを使用します。

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

#ifdef/コードのコピー/貼り付けや検索/置換を行わなくても、ターゲットとする周辺機器を変更できるようにしたいと考えています。この動作を実装できるコンパイラ ディレクティブまたは巧妙なトリックがあり、コードを 1 回だけ記述する必要がありますか? 周辺機器の最後の文字を #define したいのですが、そのようなものはコードの悪臭に危険なほど近づきそうです。

4

2 に答える 2

3

これはうまくいきますか?

#define INITUC(device) \
UC ## device ## 2CTL1 |= UCSWRST; \
UC ## device ## 2CTL0 |= UCSYNC+UCCKPL+UCMSB
...
INITUC(A);
INITUC(B);
于 2012-04-11T20:21:31.433 に答える
1

constこれらの定数がそうであると仮定するとdefines、次のようなことができます:

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

その後:

MAKECONST(UCA2CTL)
MAKECONST(UCB2CTL)

私の例には、必要かどうかわからない宣言が含まれていることに注意してください。必要でない場合は、定義の最初の 2 行を省略してください。例えば:

#define SETUP(X) X ## 1 |= UCSWRST; \
                 X ## 0 |= UCSYNC+UCCKPL+UCMSB;
于 2012-04-11T20:17:57.510 に答える