这个C联盟的成员之间有什么区别吗?

问题描述 投票:5回答:1

下面的typedef是来自Atmel SAMD21 ARM MCU包含文件的DIR寄存器。由于位struct成员和reg成员都是32位,因此联合中的两个成员之间是否有任何区别?

我试图理解为什么他们不只是使用uint32_t作为DIRSET寄存器的类型。我唯一认为他们只是这样定义它与其他寄存器一致,其中bit结构中有多个字段。

typedef union {
    struct {
        uint32_t DIRSET:32;
    } bit;
    uint32_t reg;
} PORT_DIRSET_Type;
c arm embedded unions bit-fields
1个回答
6
投票

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

他们当然可以用typedef struct { uint32_t reg; } PORT_DIRSET_Type做到这一点,但这个代码库很少被理性地写出来。它可以通过某些脚本自动生成。

根据经验,像这样的寄存器地图总是非常丑陋和不便携,充满了不合理的代码。作为ASF的一部分发货的是我见过的所有类别中最糟糕的一些。

© www.soinside.com 2019 - 2024. All rights reserved.