我正在开发一个嵌入式项目(PowerPC 目标,Freescale Metrowerks Codewarrior 编译器),其中寄存器是内存映射的,并在漂亮的位域中定义,以便轻松处理各个位标志。
目前,我们正在使用此功能来清除中断标志和控制数据传输。虽然我还没有发现任何错误,但我很好奇这是否安全。有什么方法可以安全地使用位域,还是我需要将每个位域包装在 DISABLE_INTERRUPTS ... ENABLE_INTERRUPTS 中?
澄清一下:微提供的标头具有以下字段
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;
我假设在位域中设置一个位不是原子的。这是一个正确的假设吗?编译器实际上为位域生成什么样的代码?使用 R(原始)字段自己执行掩码可能更容易记住操作不是原子的(很容易忘记像这样的赋值CAN_A.IMASK1.B.BUF00M = 1
不是原子的)。
感谢您的建议。