大佬教程收集整理的这篇文章主要介绍了如何让(1 << 9)通过MISRA?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
该软件是一个嵌入式系统.我们喜欢描述常量如下:
[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 */
以上是大佬教程为你收集整理的如何让(1 << 9)通过MISRA?全部内容,希望文章能够帮你解决如何让(1 << 9)通过MISRA?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。