我正在使用基于x86的内核来操纵32位内存映射寄存器。只有当CPU产生32位宽的读取和写入该寄存器时,我的硬件才能正常工作。该寄存器在32位地址上对齐,并且在字节粒度上不可寻址。控制对存储器映射寄存器的读写访问宽度C
我该怎么做才能保证我的C(或C99)编译器只会在所有情况下生成完整的32位宽读写?
例如,如果我不喜欢这样的读 - 修改 - 写操作:
volatile uint32_t* p_reg = 0xCAFE0000;
*p_reg |= 0x01;
我不希望编译器耍小聪明的事实,只有底部字节的变化,并产生8- bit宽读/写。由于机器代码对于x86上的8位操作通常更密集,所以我害怕出现不必要的优化。一般禁用优化不是一种选择。
-----编辑-------
一个有趣和非常相关论文:http://www.cs.utah.edu/~regehr/papers/emsoft08-preprint.pdf
对不起“自我推销”,但您可能会发现该项目对测试内存映射硬件或设置/读取内存映射寄存器有用:https://code.google.com/p/jeeamtee/wiki/Main。此致,Valentin Heinitz – 2010-10-20 15:31:36