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.