3

私はいくつかのマイクロコントローラーのプログラミングを行っており、次の行に沿ったコードがあります。

#define F_CPU 8000000
#define F_ADC (F_CPU / 64.0)
#define T_ADC (1.0/F_ADC)

コンパイル時に T_ADC などの計算値を出力する方法はありますか? 文字列化してみた

#define STRINGIFY(s) XSTRINGIFY(s)
#define XSTRINGIFY(s) #s
#pragma message ("T_ADC " STRINGIFY(T_ADC)) 

しかし、それは実際の値ではなく、マクロ展開 "(1/(8000000/64))" を与えるだけです。

これはマイクロ コントローラ プログラムであるためprintf、起動時に を実行するのは厄介です。私は gcc を使用しています。非標準の gcc 機能が役立つ場合は喜んで使用します。

4

3 に答える 3

1

@mbratch と @freddie が言ったように、計算はコンパイラによって行われるため、単純にプリプロセッサ ディレクティブを使用して結果を取得することはできません。現在頭に浮かぶ最も簡単な方法は、マクロをグローバル const に割り当ててから、デバッガーを使用して const の値を読み取るか、実行可能ファイルのバイナリ イメージを開くことです (定数のアドレスは、メモリ マップ ファイル)。

const float temp = T_ADC;

C 型を指定する必要があることに注意してください。マクロの結果は C 型に依存するため、これは必須の手順です。

于 2013-09-15T17:31:28.357 に答える
0

それはまさにあなたが探しているものではありませんが、役に立ちます。

/* definition to expand macro then apply to pragma message */
#define VALUE_TO_STRING(x) #x
#define VALUE(x) VALUE_TO_STRING(x)
#define VAR_NAME_VALUE(var) #var "="  VALUE(var)

#define F_CPU  8000000
#define F_ADC  (F_CPU / 64.0)
#define T_ADC  (1.0/F_ADC)

#pragma message VAR_NAME_VALUE(T_ADC) /* prints  note: #pragma message: T_ADC=(1.0/(8000000 / 64.0) */

これは文字列化と呼ばれます

編集:プリプロセッサは文字列の置換のみを行います。プラグマ メッセージを使用してから、単純なスクリプトを使用して計算を行うことができます。上記の私のコメントの続きです。

$ gcc a.c 2> out
$ python -c "print `cat out | cut -d = -f2`"
8e-06
于 2013-09-15T02:18:24.457 に答える