0

私は埋め込みコードに取り組んでおり、メモリマップされた多くのレジスタ割り当てをget()/ set()関数呼び出しに変換しようとしています。コード全体に散らばったアドレス割り当てを維持できるかどうか疑問に思いましたが、関数の引数として割り当てを受け取るように#definesを変更します。

古い方法:

#define MOTOR_REG (*(volatile unsigned char *)(0xFEE002));  //a memory-mapped register
MOTOR_REG = value;        //sets value into the memory-mapped register

望ましい新しい方法:

#define MOTOR_REG( set_motor_reg(value); )

void set_motor_reg(unsigned char)
{
   //logic to set the motor register
}

MOTOR_REG = value;       //value should be passed in to MOTOR_REG macro

では、このシナリオはCマクロで可能ですか?あなたの考えをありがとう!

4

2 に答える 2

2

Cマクロは、プリプロセッサによって実行される高度な検索と置換であるため、これを正確に行うことはできません。ただし、値をマクロパラメータとして渡す場合があります。

#define MOTOR_REG(value) set_motor_reg(value)

void set_motor_reg(unsigned char) { //logic to set the motor register }

MOTOR_REG(value); //value is passed in to MOTOR_REG macro

上記の場合、set_motor_regを直接呼び出す可能性があるため、MOTOR_REGを使用する必要はありません。C ++の使用が許可されている場合は、演算子のオーバーロードを使用した場合の目的の動作を実現できます。

于 2010-10-27T22:46:58.110 に答える
1

マクロでやりたいことを正確に行うことはできません。(これは、演算子のオーバーロードを使用してC ++で実行できますが、おそらくオプションではありません)。

変数であるかのように物事を使い続けたいのに、なぜすべてを関数に変換するのですか?

于 2010-10-27T22:46:07.580 に答える