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