在 CMSIS 中,为什么位域位置 'unsigned int' 而掩码基数 'unsigned long int'?

in CMSIS, why are bitfield positions 'unsigned int' but the mask base 'unsigned long int'?

这是来自 ST CMSIS header 的示例:

#define USART_ISR_TC_Pos              (6U)
#define USART_ISR_TC_Msk              (0x1UL << USART_ISR_TC_Pos)

在 CMSIS headers 中的任何地方,位域位置 (_Pos) 都是作为 unsigned int 类型的十进制整数常量给出的,未移位的掩码是 unsigned long int

为什么它们都没有指定为unsigned long int

没有明显的原因。我非常怀疑这些库是要与 8 或 16 位苦味者共享的,这是唯一合理的解释。

Cortex M 将是 32 位,32 位 int 和 32 位 long。最重要的是 32 位硬件外围寄存器。因此,即使 long 是 64 位,将掩码移出寄存器边界也是毫无意义的。

U 后缀足以防止有符号操作数左移的未定义行为。其他草率的库使用有问题的 1 << n 风格,所以也许 1UL 是纠正该错误的快速修复 - 1U 也可以正常工作。

  1. 位位置:在寄存器中的位置不能超过31,C中的任何整数类型都可以容纳。甚至没有理由让这个位置无符号。

  2. 掩码。由于 C 标准要求的最小 unsigned int 大小不足以容纳 32 位值,因此必须将其声明为 unsigned long。 CMSIS 作者不知道您将要使用的编译器,因此他们使用 minimal 足够的类型。