我有以下声明
CAN0_CTL_R &= ~ CAN_CTL_INIT;
和必需的错误警告:
如果按位运算符〜和<<应用于基础类型为unsigned char或unsigned short的操作数,则结果应立即转换为操作数的基础类型
寄存器定义如下:
#define CAN_CTL_INIT 0x00000001U // Initialization
#define CAN0_CTL_R (*((volatile uint32_t *)0x40040000U))
由于没有short或char数据类型,导致警告的原因是什么?
答案 0 :(得分:1)
据我所知,鉴于您所说的宏定义适用,该警告不适用于您提出的语句。但是,我推测它与整数常量0x00000001U
有关。解释为整数常量,类型为unsigned int
,但是MISRA工具可能会将其误认为是更窄的类型,因为它的值将适合更窄的类型。
我建议通过明确指定类型来减少机器或人为错误解释的可能性:
#define CAN_CTL_INIT ((unsigned int) 0x00000001U) // Initialization
或
#define CAN_CTL_INIT ((uint32_t) 0x00000001U) // Initialization
。在每个符合C的实现中,前者产生的表达式类型和值与原始表达式相同。后者可能对您来说是等效的,并且您可能在样式上更喜欢它。 (而且,如果后者发生 not 对您来说是等效的,那么您应该考虑它是否确实是您想要的。)