下面的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;
从一般的角度来看,它只是代码膨胀 - 你没有理由想要编写这样的代码。但是,ASF编码风格是每个寄存器访问以.reg
结束,因此这就是原因:他们希望保持寄存器命名并使用一致性。
他们当然可以用typedef struct { uint32_t reg; } PORT_DIRSET_Type
做到这一点,但这个代码库很少被理性地写出来。它可以通过某些脚本自动生成。
根据经验,像这样的寄存器地图总是非常丑陋和不便携,充满了不合理的代码。作为ASF的一部分发货的是我见过的所有类别中最糟糕的一些。