发 帖  
原厂入驻New
[问答] 如何替换STM32移位和逻辑操作?
149 STM32 固件 微控制器
分享
我正在尝试升级32位MCU的旧固件。fw中有许多宏,它们使用各种操作,例如逻辑移位等。我想替换这些移位和逻辑操作。下面的宏是一个示例。
  1. #define ERROR_BIT(x)  ((x & ( 1 << 10 )) >> 10)
复制代码
摆脱这些操作的主要原因是为了提高代码的可读性。在这里有什么好的替代方法?

0
2020-9-3 15:22:31   评论 分享淘帖 邀请回答
6个回答
((x >> 10)&1)可能更具可读性,但是无论哪种方式都很好。
2020-9-3 15:23:01 评论

举报

换成什么?对我来说,这是完全可读的。也许只需添加注释,即可将第10位与整数隔离开来。
2020-9-3 15:23:22 评论

举报

是否可以使用某些struct或union等可以代替这些操作的东西?
2020-9-3 15:23:45 评论

举报

不。位域是特定于编译器的,这些移位在任何地方都相同
2020-9-3 15:24:09 评论

举报

您不能使用位域,所以不要研究它们。C标准对它们的定义非常差,导致代码脆弱且完全不可移植。移位是正确的解决方案
2020-9-3 15:24:27 评论

举报

您发布的代码可读性强。假定C程序员了解常用的运算符和表达式的含义。特别是在嵌入式系统编程中,按位运算符。但是,不需要它们了解神秘宏的含义-稍后再讲。

首先,代码还有其他与可读性无关的问题,即移位运算符在带符号类型上使用很危险。因此,1应始终将编写为1u保证无符号类型。此外,还有一个初学者级的错误:宏参数不被括号包围。

此外,右移10是奇怪且不必要的。如果宏的目的是根据是否设置了位给出1或0,则可以通过将结果与进行比较!= 0,或!!在其前面使用来将其转换为布尔表达式。这样,我们就不会冒与算术移位或隐式类型提升相关的错误的风险。错误修复,我们最终得到以下结果:
  1. #define ERROR_BIT(x)  ( ((x) & (1u << 10 )) != 0 )
复制代码

这是否提高了可读性?没有丝毫!但是它修复了1个明显的错误和2个潜在的错误。

事实证明,出于提高可读性的目的,宏一点也不好,相反。要真正提高可读性,我们应该做的第一件事就是用常量替换“幻数”:
  1. #define MASK (1u << 10)
  2. ...

  3. #define ERROR_BIT(x)  ( ((x) & MASK)) != 0 )
复制代码

根据代码的作用,应该给“ MASK”一个更有意义的名称。

这就引出了问题的根源:即程序员为了执行琐碎的操作而编写秘密的宏语言。为了大大提高可读性,我们放弃了该宏:
  1. if(var & MASK)
复制代码

完全可以被所有C程序员100%理解。在一个实际的示例中,您可能会遇到以下情况:
  1. if(SPISR & SPISR_TXBUSY)
复制代码
2020-9-3 15:25:57 评论

举报

撰写答案

你正在撰写答案

如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
我要提问
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表