1

私はAVRに取り組んでおり、ライブラリには、次のようにプリプロセッサを使用TCD0_OVF_vectするデバイス割り込みベクトルが含まれています。TCD0_CCA_vect#defines

#define TCD0_OVF_vect_num  77
#define TCD0_OVF_vect      _VECTOR(77)  /* Overflow Interrupt */

それらにはタイマー オブジェクトも含まれます。

typedef struct TC0_struct
{
  register8_t CTRLA;  /* Control  Register A */
  ...snip...
} TC0_t;

#define TCD0    (*(TC0_t *) 0x0900)  /* 16-bit Timer/Counter 0 */

に似た構文TCD0を使用して、名前付きタイマー オブジェクト を展開するマクロを定義できるようにしたいと考えています。例えば:TCD0_OVF_vectVECT(TCD0, OVF_vect)

ISR(VECT(TCD0, CCA_vect)) {}

に変換します

ISR(TCD0_CCA_vect) {}

whereTCD0_CCA_vectは展開する必要があるマクロです。

これを行う方法はありますか?

編集: さらに、次のことができるようになりたいです

#define TIMER TCD0
#define VECT(a, b) ##SOMETHING##

そして、使用VECT(TIMER, CCA_vect)して終了することができTCD0_CCA_vectます。これには別のレベルの間接化が必要であることはわかっていますが、頭を悩ませることはできません。

4

2 に答える 2

3

それはとても簡単です:

#define VECT(a, b)  a##_##b

X##Y連結XYれ、単一の識別子として表示されます。

あなたの特定のケースではTCD0_CCA_vectを単一の識別子に連結する必要がありますTCD0_CCA_vect

これは変数では機能しないことに注意してください。

于 2013-10-25T12:52:04.490 に答える
2

これは、トークン連結を使用して仕事をするはずです。

#define VECT(a, b) a ## _ ## b

コメントから:

#define TIMER TCD0使用してから使用することは可能VECT(TIMER, CCA_vect)ですか?

直接ではありませんが、別のレベルのマクロを使用すると、答えはイエスになります。

#define TIMER TCD0
#define PVECT(a, b) a ## _ ## b
#define VECT(a, b)  PVECT(a, b)

VECT(TIMER, CCA_vect)

その出力は次のとおりです。

TCD0_CCA_vect

PVECT に渡される引数は、渡される前に展開されるため、これが機能します。

于 2013-10-25T12:53:19.203 に答える