【发布时间】:2016-12-03 06:16:24
【问题描述】:
我很难理解在 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) 中用全零和 1 填充它,则逻辑确实有效。我不确定我的测试条件是不正确还是其他原因。
谁能帮忙?
【问题讨论】:
-
creg的类型是什么? -
"如果第 29 位没有设置" - 为什么不直接设置呢。
-
您的目标到底是什么?如果您只是想设置一点,那么我什至根本不会打扰条件,只需设置它即可。如果它已经设置好了,谁在乎呢?
-
您编写的代码预计
CREG_CLK_CTRL_I2C0为 29,第 29 位。您确定是这种情况,并且CREG_CLK_CTRL_I2C0不是第 29 位的 0b00100000000000000000000000000000 吗? -
永远不要使用演员表,直到你能证明你必须这样做并且你理解所有的含义!您使用的宏应该已经正确定义(如果没有获得另一个工具链,那就不好了。并且要小心移位有符号整数。除非您真的知道自己在做什么并且必须这样做,否则请避免使用它们!