x86ベースのコアを使用して32ビットメモリマップドレジスタを操作しています。私のハードウェアは、CPUが32ビット幅の読み取りと書き込みをこのレジスタに生成する場合にのみ正しく動作します。レジスタは32ビットアドレスにアラインされており、バイト粒度でアドレス指定できません。
C(またはC99)コンパイラがすべての場合に完全な32ビット幅の読み取りと書き込みのみを生成することを保証するにはどうすればよいですか?
たとえば、次のような読み取り-変更-書き込み操作を実行すると、次のようになります。
volatile uint32_t* p_reg = 0xCAFE0000;
*p_reg |= 0x01;
一番下のバイトだけが変更され、8ビット幅の読み取り/書き込みが生成されるという事実についてコンパイラーが賢くなりたくありません。x86での8ビット演算では、マシンコードの密度が高くなることが多いため、不要な最適化が心配です。一般に、最適化を無効にすることはできません。
-----編集-------
興味深く、非常に関連性の高い論文:http ://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf