如何让(1 << 9)通过MISRA?

参见英文答案 > MISRA C:2004,error with bit shifting3个
我们正在使用Parasoft Static Analysis,并启用了MISRA C 2004检查程序.

该软件是一个嵌入式系统.我们喜欢描述常量如下:

[1]    #define MOTOR_ON (1 << 9)

这将显示寄存器中的第9位应为1以打开电机.

表达式失败了MISRA,所以我们改变了它:

[2]    #define MOTOR_ON (1U << 9U)

更改转换为无符号整数常量,因为最好使用无符号整数进行移位.

语句2中的表达式仍然失败,因为右手操作符(9U)需要检查.根据MISRA,如果右手操作符大于左手操作符的底层类型的位宽,则存在问题.

该问题的基础是1U具有基础类型的无符号字符或8位.
我们写的寄存器是16位,所以理论上没有问题.

如何更改[2]中的表达式,使其通过MISRA C 2004,更喜欢不使用演员表?

我正在使用IAR Embedded Workbench和8/32位模式的ARM7TDMI处理器.

编辑1:示例代码.

void turn_on_motor(void);
#define MOTOR_ON (1U << 9U)
void turn_on_motor(void)
{
    uint16_t * const p_motor_control = (uint16_t *)(0x01234567U);
    *p_motor_control = MOTOR_ON;
}

错误文本:应限制用作移位运算符的右侧操作数的常量.

来自Parasoft提供的MISRA规则文档:

Rule reports a violation if:

- the right-hand operand is a constant with negative value or with value that
  exceeds the length (in bits) of the left-hand operand

- the right-hand operand is not a constant and is not checked by specific
  pattern

解决方法

您也可以通过使用来简单地绕过转移问题
#define MOTOR_ON ((uint16_t)512U)   /* 1 << 9 = 2^9 */

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...