c - C中的位设置逻辑

标签 c arduino logic bit

我很难理解在 32 位寄存器中成功设置位背后的逻辑。这是该函数的伪代码:

读取主寄存器,
如果第29位CREG_CLK_CTRL_I2C0没有设置,则设置

uint32_t creg;

//read the CREG Master register   
creg = READ_ARC_REG((volatile uint32_t)AR_IO_CREG_MST0_CTRL);

if((creg & (1 << CREG_CLK_CTRL_I2C0)) == 0){
     creg |= ( 1 << CREG_CLK_CTRL_I2C0);
     WRITE_ARC_REG(creg, (volatile uint32_t)(AR_IO_CREG_MST0_CTRL));
}

如果 CREG 主寄存器最初为空,则逻辑不会按预期工作。但是,如果我在第 31 位 (1000...0) 中用全 0 和 1 填充它,则逻辑确实有效。我不确定我的测试条件是否不正确或者可能是其他原因。

有人能帮忙吗?

最佳答案

就个人而言,我会使用给定的数据类型:uint32_t。无论上下文如何,这都将保证对齐。那是(为了清晰起见,假设转换不会产生不同的大小类型):

uint32_t mask = ((uint32_t)1) << CREG_CLK_CTRL_I2C0;
if((creg & mask) == 0){
     creg |= mask;
     WRITE_ARC_REG(creg, (volatile uint32_t)(AR_IO_CREG_MST0_CTRL));
}

关于c - C中的位设置逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38643407/

相关文章:

c - 反转C中双链表的元素

c - 减去两个时间间隔

c - 具有其他阻挡功能的Arduino IR Remote

c++ - Arduino Sublime Text 2。我可以编译但不能上传。错误 "The system cannot find the file specified"

在 C 中编译和运行没有 main() 的程序

c - 用于调试的 makefile 标志(需要符号信息)-g 标志不起作用

c - 缓冲区溢出和集中错误处理

java - 查找应该为每一行的一个参数至少定义一个值的记录

ruby-on-rails - Rails 密码在 24 小时内过期

sql - 为什么这是 AND、OR 与 NULL 的真值表?