gpt4 book ai didi

c - 如何使 (1 << 9) 通过 MISRA?

转载 作者:太空狗 更新时间:2023-10-29 17:12:28 25 4
gpt4 key购买 nike

<分区>

我们正在使用 Parasoft 静态分析并打开 MISRA C 2004 检查器。

该软件是一个嵌入式系统。我们喜欢这样描述常量:

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

这表明寄存器中的第 9 位应为 1 才能启动电机。

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

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

更改转换为无符号整数常量,因为移位最好用无符号整数完成。

语句 2 中的表达式仍然失败,因为右侧运算符 (9U) 需要检查。根据 MISRA,如果右手运算符大于左手运算符基础类型的位宽,就会出现问题。

问题的根源在于 1U 的底层类型为 unsigned char 或 8 位。
我们要写入的寄存器是 16 位的,因此理论上没有问题。

如何更改 [2] 中的表达式,使其通过 MISRA C 2004,而不是使用强制转换?

我在 8/32 位模式下使用 IAR Embedded Workbench 和 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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com