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

JJM*_*sen 7 c embedded compound-assignment

在C和C++代码中,特别是对于嵌入式系统,我经常偶然发现具有以下形状的赋值:

A |= B;
A &= B;
Run Code Online (Sandbox Code Playgroud)

不确定是否相关,但A和B是寄存器.请参阅此处的示例:http: //processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x#Example_Code 出现以下行:

IER |= 0x002;
IER &= 0x002;
Run Code Online (Sandbox Code Playgroud)

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

A = B;
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*ovs 6

当然,以下两个命令的顺序:

A |= 0x02;
A &= 0x02;
Run Code Online (Sandbox Code Playgroud)

与以下相同:

A = 0x02;
Run Code Online (Sandbox Code Playgroud)

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


UPDATE

变量与硬件寄存器

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

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

unsigned char A;
Run Code Online (Sandbox Code Playgroud)

硬件寄存器定义类似于:

#define A (*(volatile uint16_t *)(0x1234))
Run Code Online (Sandbox Code Playgroud)

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

注意volatile关键字.来自维基:

此关键字可防止优化编译器优化后续读取或写入,从而错误地重用过时值或省略写入.易失性值主要出现在硬件访问(内存映射I/O)中,其中读取或写入内存用于与外围设备通信,以及在线程中,其中不同的线程可能已修改了值.