推荐星级:
  • 1
  • 2
  • 3
  • 4
  • 5

固件位操作bug的常见来源

资料介绍

固件里的"位操作":很多bug藏在"移位和掩码"里 一、位操作是固件的"基本功" 嵌入式固件大量用位操作(移位、与、或、异或)来处理寄存器、状态位、标志、协议数据。位操作写起来简短,但也很容易出错——优先级搞错、掩码写错、移位方向错、符号扩展坑,这些都是隐藏bug的来源。 很多人觉得位操作简单(不就是一个&、一个<<吗),但实际写的多了就会发现,位操作里的坑不少。 二、位操作的常见坑 2.1 优先级错误 位运算符的优先级常被搞混。比如: cif (reg & 0x80 == 0x80) // 错误!==优先级高于&,先比较再与 应该写: cif ((reg & 0x80) == 0x80) // 正确 优先级搞错,判断结果就错了。稳妥的做法:位运算加括号。 2.2 掩码写错 设置某位时,掩码写错(应该置1的位没置、该保留的位被清了)。比如要设置bit3,应该用 | (1<<3),写成 | (1<<2) 就错了。 2.3 移位方向错 左移<<和右移>>搞错,数据就反了。 2.4 符号扩展 有符号数右移,是算术右移(高位补符号位),不是逻辑右移(补0)。如果没注意,结果会错。 2.5 移位位数超限 移位的位数超过类型宽度(比如int移32位),行为未定义,结果不对。 2.6 读改写不原子 "读-改-写"寄存器(读出来、改某位、写回去),如果中间被中断打断,可能丢修改(竞态)。

部分文件列表

文件名 大小
固件位操作bug的常见来源.docx 38K

全部评论(0)

暂无评论

上传资源 上传优质资源有赏金

  • 打赏
  • 30日榜单

推荐下载