在 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
也可以正常工作。
位位置:在寄存器中的位置不能超过31,C中的任何整数类型都可以容纳。甚至没有理由让这个位置无符号。
掩码。由于 C 标准要求的最小 unsigned int
大小不足以容纳 32 位值,因此必须将其声明为 unsigned long。 CMSIS 作者不知道您将要使用的编译器,因此他们使用 minimal 足够的类型。
这是来自 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
也可以正常工作。
位位置:在寄存器中的位置不能超过31,C中的任何整数类型都可以容纳。甚至没有理由让这个位置无符号。
掩码。由于 C 标准要求的最小
unsigned int
大小不足以容纳 32 位值,因此必须将其声明为 unsigned long。 CMSIS 作者不知道您将要使用的编译器,因此他们使用 minimal 足够的类型。