这个C工会的成员之间有什么区别吗?

时间:2019-02-27 04:56:29

标签: c arm embedded unions bit-fields

下面的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;

1 个答案:

答案 0 :(得分:6)

从一般的角度来看,这只是代码膨胀-没有理由为什么要编写这样的代码。但是,ASF编码风格是每个寄存器访问都以.reg结尾,所以这就是这里的原因:他们希望保持寄存器命名并使用一致。

他们当然可以使用typedef struct { uint32_t reg; } PORT_DIRSET_Type来做到这一点,但是很少有人会合理地编写此代码库。它可能是通过某些脚本自动生成的。

根据经验,像这样的寄存器映射总是非常丑陋且不可携带,并充满了不合理的代码。作为ASF的一部分交付的产品是我见过的所有类别中最糟糕的一些产品。