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

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

概述在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; 但是,这些后续 在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复合赋值运算符的目的所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1240731.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存