C编译器对位域做了什么?

Ada*_*mke 8 c embedded bit-manipulation powerpc

我正在开发一个嵌入式项目(PowerPC目标,Freescale Metrowerks Codewarrior编译器),其中寄存器是内存映射的,并在很好的位域中定义,以便轻松地对各个位标志进行调整.

目前,我们正在使用此功能来清除中断标志并控制数据传输.虽然我还没有注意到任何错误,但我很好奇这是否安全.有没有办法安全地使用位字段,或者我需要将每个包装在DISABLE_INTERRUPTS ... ENABLE_INTERRUPTS?

澄清一下:micro提供的头文件有

union {
        vuint16_t R;
        struct {
            vuint16_t MTM:1;        /* message buffer transmission mode */
            vuint16_t CHNLA:1;      /* channel assignement */
            vuint16_t CHNLB:1;      /* channel assignement */
            vuint16_t CCFE:1;       /* cycle counter filter enable */
            vuint16_t CCFMSK:6;     /* cycle counter filter mask */
            vuint16_t CCFVAL:6;     /* cycle counter filter value */
        } B;
    } MBCCFR;
Run Code Online (Sandbox Code Playgroud)

我假设在位域中设置一点不是原子的.这是正确的假设吗?编译器实际为比特域生成了什么样的代码?使用R(原始)字段自己执行掩码可能会更容易记住操作不是原子操作(很容易忘记类似的赋值CAN_A.IMASK1.B.BUF00M = 1不是原子的).

您的建议表示赞赏.

Pet*_* G. 3

原子性取决于目标和编译器。例如,AVR-GCC 尝试检测位访问并在可能的情况下发出位设置或清除指令。检查汇编器输出以确保...

编辑:这是直接来自马口的 PowerPC 原子指令的资源:

http://www.ibm.com/developerworks/library/pa-atom/