下面的类型定义用于Atmel SAMD21 ARM MCU包含文件中的DIR寄存器。由于bit结构成员和reg成员都是32位,那么联合中的这两个成员之间有什么区别吗?
我试图理解为什么他们不直接使用uint32_t作为DIRSET寄存器的类型。我唯一的想法是,他们只是这样定义它,以便与位结构中有多个字段的其他寄存器保持一致。
typedef union {
struct {
uint32_t DIRSET:32;
} bit;
uint32_t reg;
} PORT_DIRSET_Type;发布于 2019-02-27 16:09:55
从一般的角度来看,这只是代码膨胀--你没有理由要写这样的代码。然而,ASF的编码风格是每个寄存器访问都以.reg结尾,所以这就是这里的原因:他们希望保持寄存器命名和使用的一致性。
他们当然可以用typedef struct { uint32_t reg; } PORT_DIRSET_Type做到这一点,但是这个代码库很少被合理地编写。它可能是通过某个脚本自动生成的。
作为一个经验法则,像这样的寄存器映射总是非常丑陋和不可移植,充满了不合理的代码。那些作为ASF的一部分发货的是我见过的所有类别中最糟糕的。
https://stackoverflow.com/questions/54898273
复制相似问题