2

私はこの定義を持っています

#define LED_CLOCK_PIN (DDRD, PORTD, PD6)

PORTDを取得するために、さらに2つの定義を記述したいと思います。PD6

#define GET_PORT(_PORT_) /*some magic goes here*/
#define GET_PIN(_PIN_) /*some magic goes here*/

uint8_t port = GET_PORT(LED_CLOCK_PIN);
uint8_t pin = GET_PIN(LED_CLOCK_PIN);

出来ますか?

4

3 に答える 3

4

次のような意味ですか?

#define LED_CLOCK_PIN (DDRD, PORTD, PD6)

#define SND(A, B, C) B
#define GET_PORT(X) SND X

uint8_t port = GET_PORT(LED_CLOCK_PIN);

gcc -Eに処理しuint8_t port = PORTD;ます。これが完全に移植可能であり、標準によって保証されているかどうかはわかりません。

于 2012-12-09T14:44:40.560 に答える
1

変更が許可された場合は、最初に次のように定義します。

#define LED_CLOCK_PIN  DDRD, PORTD, PD6

次に、C99を使用して実行できます(テストされていません)。

#define GET_PORT(x)  (((int[]){x})[1])
于 2012-12-09T14:48:31.100 に答える
0

名前で直接アクセスするのではなく、ポートをパラメーター化する理由はありますか?つまり、代わりに

#define GET_PORT

次のようなものがある方が理にかなっていますか

#define GET_PORT_D (port.D)
#define LED_CLOCK_PIN 0x10 //Bit 5 of the port.D register, for example
#define GET_LED_CLOCK_PIN ( (port.D & LED_CLOCK_PIN) >> 4)

このように、ポートで何をしているかにあいまいさがないため、読みやすさが向上します。次に、LED_CLOCK_PIN(ハードウェアにアクセスするため)実際の意味を変更する可能性はおそらくかなり低いので、コードを明確にしてみませんか。

于 2012-12-09T14:54:47.017 に答える