我已将此功能设置为寄存器中的位:
void setBitsInRange( const uint32_t offset, const uint8_t fromBit, const uint8_t numOfBits, uint32_t val )
{
uint32_t regVal = readRegister( offset );
uint32_t mask = (( 1 << ( fromBit + numOfBits)) - ( 1 << fromBit));
aValueToSet = val << fromBit;
uint32_t result = ( regVal & ~mask) | ( val & mask );
writeRegister( offset, result );
}
这适用于所有位,除非我需要更改所有32位。有没有办法使用给定的API执行此操作?
这是一个例子
writeRegister(registerOffset,0x0);
setBitsInRange(registerOffset,0,32, 0xFFFFFFFF );
CHECK_EQUAL(0xFFFFFFFF, readRegister(registerOffset)); //FAIL
writeRegister(registerOffset,0x0);
setBitsInRange(registerOffset,0,31, 0x7FFFFFFF );
CHECK_EQUAL(0x7FFFFFFF, readRegister(registerOffset));
writeRegister(registerOffset,0x0);
setBitsInRange(registerOffset,16,16,0xAAAA);
readBack = readRegister(registerOffset);
CHECK_EQUAL(0xAAAA0000, readBack);
答案 0 :(得分:1)
如果它适用于除fromBit == 0 && numOfBits == 32
之外的所有输入,那么这应该解决它:
uint32_t mask = (uint32_t)(((1LL << (fromBit + numOfBits)) - (1 << fromBit)))
答案 1 :(得分:0)
它实际上对任何32位移位都不起作用。 uint32_t(1) << 32
刚刚未定义。
但是,由于您以后执行- 1 << (fromBit)
,并且未分类算术是模块化的,因此无论您执行uint32_t(1ULL << 32 - 256)
还是0UL - 256UL
都无关紧要。在这两种情况下,结果都是~255UL,但在后者中它只是一个32位操作。
所以你基本上需要加前缀(fromBit + numOfBits == 32) ? 0 :