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

前端之家收集整理的这篇文章主要介绍了随后在寄存器上使用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.

猜你在找的C&C++相关文章