2016-06-14 15 views
0

USARTモジュールをXMEGAマイクロコントローラに設定しようとしていますが、見つからないエラーが発生しました。明確にするために、私はあなたに完全なコードを与えます。したがって、このヘッダファイルには何もありません。プリプロセッサ:トークンの前に2進演算子がありません

#ifndef USART_H_ 
#define USART_H_ 

#include <avr/io.h> 



#define USART_BAUDRATE   4800 
#define USART_BSCALE   -3 

#if USART_BSCALE < 0 
    #define USART_BSEL   F_CPU/(pow(2,USART_BSCALE) * 16 * USART_BAUDRATE) - 1 
    #define USART_BAUD_REAL  F_CPU/(pow(2,USART_BSCALE) * 16 * (USART_BSEL + 1)) 
#else 
    #define USART_BSEL   (1/(pow(2,USART_BSCALE))) * (F_CPU/(16 * USART_BAUDRATE) - 1) 
    #define USART_BAUD_REAL  F_CPU/(16 * ((pow(2,USART_BSCALE) * USART_BSEL) + 1)) 
#endif 

#define USART_BAUD_ERROR  USART_BAUD_REAL * 1000/USART_BAUDRATE 

#if USART_BAUD_ERROR<990 || USART_BAUD_ERROR>1010 /* <-- ERROR IS IN THIS LINE! */ 
    #error Baud rate error too high! 
#endif 


#endif /* USART_H_ */ 

F_CPUメインファイルで定義されている)コンパイラは、標線における

missing binary operator before token "("

エラーで終了します。前に括弧がありましたが、それらを削除し、異なる括弧の組み合わせを試しましたが、コンパイラはまだそれらを参照しています。ここで何が間違っていますか?

+4

#ifプリプロセッサディレクティブ引数の中でC関数(pow ...)を使用することはできません。なぜなら、コンパイル時にプリプロセッサによって評価されるからです... –

+0

ああ、それは悪いです。力を計算する別の方法はありますか? – Peder

+2

2の累乗?シフトビット(そしてそれらはサポートされています:https://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_4.html#SEC38) –

答えて

2

#ifプリプロセッサーディレクティブは、前処理段階で評価されます。関数powは実行時に評価されます。したがって、#ifに渡されるプリプロセッサトークン(マクロ)の内部では使用できません。これらの値はすべてコンパイル時に計算する必要があります。

ヒント:「2回n」は1 << n(ビット単位の左シフト)と同じです。あなたはおそらく、浮動小数点数を使用するべきではありませんので、あなたがこのAVRをタグ付けしている

  • はまた、他のいくつかの深刻な問題があります。彼らはあなたのプログラムを信じられないほど遅くして、あらゆる種類のバグの可能性を広げるだけでなく、それらを使うことで得られるものもありません。

    あなたが「浮動小数点ライブラリが見つからない」などの警告が表示されます。不運な場合、プログラムはリンクし、実行速度とメモリをすべて吹き飛ばします。

    浮動小数点の使用を検討する前に、ターゲットシステムにFPUがあるかどうかを確認することをお勧めします。

  • マクロ式を囲む括弧を付けて、マクロを適切に記述する必要があります。ちょうどあなたの第二のUSART_BSELのように正しく書かれています。それ以外の場合は、マクロが式で使用されている場合、演算子の優先順位に関連する非常に微妙で非常に重大なバグを得ることができます。すべての半分のまともなCの本は、この非常に問題をプリプロセッサの章で扱っています。
関連する問題