随后在寄存器上使用OR和AND复合赋值运算符的目的

发布时间:2019-10-09 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了随后在寄存器上使用OR和AND复合赋值运算符的目的脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在C和C代码中,特别是对于嵌入式系统,我经常偶然发现具有以下形状的分配:
A |= B;
A &= B;

不确定是否相关,但A和B是寄存器.在这里查看示例:
http://processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x#Example_Code
出现以下行:

IER |= 0x002;
IER &= 0x002;

但是,这些后续分配似乎与单个分配相同

A = B;

除了理论上,前者在某些情况下可以在两条线之间中断,但这似乎在大多数代码中都不起重要作用.

使用前者优于后者是否有优势,还是我看不到其他差异?

解决方法

当然,以下两个命令的顺序:
A |= 0x02;
A &= 0x02;

与以下内容相同:

A = 0x02;

除非A不是变量,而是硬件寄存器.在这种情况下,您需要参考MCU / CPU(或映射外设)手册来检查为什么需要这个序列.

UPDATE

变量与硬件寄存器

在上面的评论中,OP询问如何区分变量和寄存器.

这很容易.您需要做的就是查看定义.虽然典型的变量将被定义为:

unsigned char A;

硬件寄存器定义类似于:

#define A (*(volatile uint16_t *)(0x1234))

这里,A被定义为硬件寄存器的值,映射到0x1234处的地址.每个微控制器或CPU都有自己独特的硬件寄存器集,不仅在不同类型的架构和模型之间,而且在不同的制造商之间也会有所不同.如果没有详细记录源代码,告诉硬件数据表的唯一方法是查看硬件数据表.此外,一些高级架构可以将来自某些外设的硬件寄存器映射到CPU地址空间,因此可以以相同的方式访问外部组件的硬件寄存器.

请注意volatile关键字.从wiki

This keyword prevents an optimizing compiler from optimizing away subsequent reads or writes and thus incorrectly reusing a stale value or omitting writes. Volatile values primarily arise in hardware access (memory-mapped I/O),where reading from or writing to memory is used to communicate with peripheral devices,and in threading,where a different thread may have modified a value.

总结

以上是脚本之家为你收集整理的随后在寄存器上使用OR和AND复合赋值运算符的目的全部内容,希望文章能够帮你解决随后在寄存器上使用OR和AND复合赋值运算符的目的所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:76874919,请注明来意。

快乐,其实很简单!比如有我~

关注我升职加薪

标签: