下面的typedef用于Atmel SAMD21 ARM MCU包含文件中的DIR寄存器。由于bit的struct成员和reg成员都是32位,因此联合中的两个成员之间有什么区别吗?
我试图理解为什么他们不仅仅使用uint32_t作为DIRSET寄存器的类型。我唯一想到的是,他们只是用这种方式定义了它,使其与其他在位结构中有多个字段的寄存器保持一致。
typedef union {
struct {
uint32_t DIRSET:32;
} bit;
uint32_t reg;
} PORT_DIRSET_Type;
答案 0 :(得分:6)
从一般的角度来看,这只是代码膨胀-没有理由为什么要编写这样的代码。但是,ASF编码风格是每个寄存器访问都以.reg
结尾,所以这就是这里的原因:他们希望保持寄存器命名并使用一致。
他们当然可以使用typedef struct { uint32_t reg; } PORT_DIRSET_Type
来做到这一点,但是很少有人会合理地编写此代码库。它可能是通过某些脚本自动生成的。
根据经验,像这样的寄存器映射总是非常丑陋且不可携带,并充满了不合理的代码。作为ASF的一部分交付的产品是我见过的所有类别中最糟糕的一些产品。