我正在使用基于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