8

私はマイクロプロセッサ用のコードに取り組んでいます。
大きくて重要な定数がいくつかあります。

#define F_CPU 16000000UL

この場合、これは CPU 周波数です。ヘルツで。

そのままでは、1,600,000、160,000,000、または 16,000,000 のいずれであるかを、手動でカーソルを数字の上に移動しないと判断するのはかなり困難です。

number にコンマを入れる#define F_CPU 16,000,000ULと、定数が切り捨てられます。

私は、特定の桁区切り文字を持ついくつかの難解な言語を使用してきました。これは、大きな数字を読みやすくすることを目的としています (例16_000_000、主に MCU 向けの言語)。大きな「マジック ナンバー」は、MCU が現実の世界と対話する方法の側面を記述するために必要とされるため、組み込みのものではかなり一般的です。

Cでこのようなものはありますか?

4

8 に答える 8

11

はい、C にはプリプロセッサ セパレータがあります。##

だからあなたは書くことができます

#define F_CPU 16##000##000UL

これは16000000UL とまったく同じ意味です。(16*1000*1000 のような他の構造とは異なり、乗算が問題を引き起こす可能性のある場所に配置しないように注意する必要があります。)

于 2012-06-11T09:22:27.133 に答える
6

多分そのようなもの?

#define MHz(x) (1000000 * (x))
...
#define F_CPU MHz(16)

また、私はsが好きではありません#define。通常、enums または定数を使用することをお勧めします。

static const long MHz = 1000*1000;
static const long F_CPU = 16 * MHz;
于 2012-06-11T09:19:33.300 に答える
5

1 つの可能性は、次のように記述することです。

#define F_CPU (16 * 1000 * 1000)

代わりに

#define MHz (1000*1000)
#define F_CPU (16 * MHz)

編集:他の人が提案したMHz(x)の方が良いかもしれません

于 2012-06-11T09:20:44.470 に答える
4

計算の結果として定数を書くことができます(16*1000*1000あなたの例のために)。さらに良いことに、別のマクロMHZ(x)を定義し、定数をとして定義することもできますMHZ(16)。これにより、名前空間の衝突確率が発生する代わりに、コードが少し自己文書化されます。

于 2012-06-11T09:19:17.963 に答える
1
// constants.h
#define Hz   1u              // 16 bits
#define kHz  (1000u  *  Hz)  // 16 bits
#define MHz  (1000ul * kHz)  // 32 bits

// somecode.h
#define F_CPU (16ul * MHz)   // 32 bits

ノート:

  • int8 ビット MCU では 16 ビットです。
  • 16 ビット リテラルは、可能な限り 8 ビット リテラル (8 ビット命令を使用) に最適化されます。
  • 符号付き整数リテラルは危険です。組み込みシステムでよく見られるように、ビットごとの演算子と混在している場合は特に危険です。デフォルトですべてを無署名にします。
  • 32 ビット変数はほとんどの 8-bitter で非常に遅いため、定数が 32 ビットであることを示す変数表記またはコメントを使用することを検討してください。
于 2012-06-12T14:40:48.810 に答える
0

定数を次のように定義すると、読みやすくなる場合があります。

#define F_CPU_HZ 16000000UL

そうすれば、どのタイプのデータが含まれているかを知ることができます。SWには、さまざまなプリスケーラを設定する必要のある周辺機器がいくつかあるため、次の#definesようになります。

#define SYS_CLK_MHZ    (48)
#define SYS_CLK_KHZ    (SYS_CLK_MHZ * 1000)
#define SYS_CLK_HZ     (SYS_CLK_KHZ * 1000)
于 2012-06-22T17:45:22.920 に答える
0

科学表記法を使用できます。

#define F_CPU 1.6e+007

または:

#define K 1000

#define F_CPU (1.6*K*K)
于 2012-06-11T09:24:57.047 に答える