澄清一下:微控制器提供的头文件具有类似于以下结构的字段:
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
这样的赋值操作不是原子操作)。感谢您的建议。
vuint16_t
中的v
是否代表 "volatile"? - JAB