組み込みシステムで C をプログラミングしています。プロセッサ アーキテクチャは 32 ビット (sizeof(int)
は 32 ビット、sizeof(short)
は 16 ビット) です。下位 16 ビットのみが使用されるように指定されたメモリ マップド コントロール レジスタ ( ) である 32 ビット変数がありCTRL_REG
、符号付き 16 ビット整数値が含まれます (上位ビットへの書き込みは影響しません)。メモリ アクセスは 32 ビットでアラインされている必要があるため、ポインターを数バイトにまたがらせることはできません。また、エンディアンを想定することもできません。符号ビットを必要なビット 15 に残すのではなく、ビット 31 に拡張することによって、自動型昇格が保存しているものを台無しにするのではないかと心配しています。この場所に何かを保管する最良の方法は何ですか?
これが私の元のコードで、これが間違っていることはほぼ確実です。
#define CTRL_REG *((volatile unsigned int *)0x4000D008u)
short calibrationValue;
CTRL_REG = -2 * calibrationValue;
次に、これを試しましたが、割り当ての時点で整数昇格の対象となる可能性があると思います。
CTRL_REG = (short)(-2 * calibrationValue);
そして、最後に次のように考えました。
CTRL_REG = (unsigned short)(short)(-2 * calibrationValue);
これらのオプションをうまく評価できないのは、calibrationValue
たまたま負の値 (各デバイスに固有のキャリブレーション パラメーターであり、一部のデバイスでは正の可能性がある) であるため、テストですべて機能するためです。-2 を掛けた後、終了します。正の値を格納しているため、テストで予想している問題に実際には遭遇しません。
「考えすぎ」というだけでも、よろしくお願いします。