16 ビット ターゲット プラットフォームで avr-gcc を使用しています
私はこのようなことをしたいと思います:
#define F_CPU 16000000
#define MIN_UPDATES_PER_REV 100
#define MAX_RPM 10000
#define UPDATE_PERIOD_cy ( F_CPU*60 / (MIN_UPDATES_PER_REV*MAX_RPM) )
予想どおり、MIN_UPDATES_PER_REV*MAX_RPM が 0xf4240 に評価されるため、オーバーフロー エラーが発生します。
bldc.h:9:40: warning: integer overflow in expression [-Woverflow]
#define UPDATE_PERIOD_cy ( F_CPU*60 / (MIN_UPDATES_PER_REV*MAX_RPM) )
^
-Woverflow の利点は失われますが、定数を 32 ビットに強制し、折り畳み後に uint16_t に戻すとうまくいきます。
#define UPDATE_PERIOD_cy (uint16_t)( (uint32_t)F_CPU*60 / ((uint32_t)MIN_UPDATES_PER_REV*MAX_RPM) ))
一定の折り畳み中に gcc に大きな中間値を処理させることはできますか?
プリプロセッサに定数の折りたたみを強制することはできますか?
知っておくべきベスト プラクティスはありますか?