问题描述
在执行
上下文类型的定义
typedef uint32_t uint32;
typedef volatile uint32* canreg_txrx_pointer;
canreg_txrx_pointer canreg_txrx;
uint8_t valueRead,value;
#define CAN_DIR_BIT_POS ((uint8_t)2U)
#define CAN_OUT_BIT_POS ((uint8_t)1U)
#define CAN_IN_BIT_POS ((uint8_t)0U)
尝试对寄存器执行一系列 #1397-D (MISRA-C:2004 10.5/R) If the bitwise operators ~ and << are applied to an operand of underlying type unsigned char or unsigned short,the result shall be immediately cast to the underlying type of the operand
下面给出了一个没有通过 misra 检查的例子,然后给出了一个通过的例子
*canreg_txrx = (uint32)((*canreg_txrx & (~(uint32)(1U << CAN_OUT_BIT_POS))) | (uint32)(value << CAN_OUT_BIT_POS)); //doesn't pass MISRA
valueRead = (uint8_t)(((uint8_t)*regToOperateOn & (uint8_t)(1U << CAN_OUT_BIT_POS)) >> CAN_OUT_BIT_POS); //passes MISRA
我已尝试对违规行进行多次更改,但都没有导致 MISRA 允许它通过(除了随机,它只是没有给我警告)到我决定全部投出的地步,但仍然没有工作
*canreg_txrx = (uint32)((*canreg_txrx & (uint32)(~(uint32)((uint32)1U << (uint32)CAN_OUT_BIT_POS))) | (uint32)((uint32)value << (uint32)CAN_OUT_BIT_POS)); //doesn't pass MISRA
我真的很困惑如何修复此代码,以便它通过 MISRA,因为此按位逻辑在多个地方使用并且所有这些都没有通过。我认为如果一切都被强制转换为相同的类型,那么应该没有问题,因为它们都以相同的类型运行,但由于某种原因不起作用。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)