首页 > 解决方案 > 这个C工会的成员有什么区别吗?

问题描述

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

标签: carmembeddedunionsbit-fields

解决方案


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

他们当然可以这样做,typedef struct { uint32_t reg; } PORT_DIRSET_Type但是这个代码库很少被合理地编写。它可能是通过一些脚本自动生成的。

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


推荐阅读