如果我想编写一个同时设置和清除某些内部位的线程安全方法,我可能会使用两个参数:要修改的内部位的32位掩码和一个32位掩码,指示是否将第一个参数指定的内部位设置为0或1。
命名这两个参数的惯例是什么?
答案 0 :(得分:2)
我没有听说过任何整体标准,虽然我工作的很多地方都有命名标准等。
掩码中的每个位都是单独定义的,例如:
#define TANK_GAUGE_OK (0x80) // 1 when the gauge is properly initialized and working
#define TANK_FULL (0x08) // 1 when tank is filled completely
#define TANK_HIGH (0x04) // 1 when tank is at least 1/4 full
#define TANK_LOW (0x02) // 1 when tank is at least 1/8 full
#define TANK_NOTEMPTY (0x01) // 1 when there is some fuel in tank
#define TANK_LIGHTS_MASK (TANK_FULL | TANK_HIGH | TANK_LOW | TANK_NOTEMPTY )
对于功能名称 -
SET_ON(unsigned setMask), SET_OFF(unsigned clearMask)
更新寄存器中的特定位:
Update(changeMask, valueMask)
其中 changeMask 包含要更新的位,为1, valueMask 包含您要设置的位值。
您可以像嵌入式电量计监视器的代码一样使用它们:
static unsigned short fuelGaugeRegisterValue = 0x0000;
extern unsigned short *fuelGaugeRegister;
. . .
void UpdateFuelGauge(unsigned changeMask, unsigned valueMask) {
// code to grab mutex goes here...
fuelGaugeRegisterValue &= (~changeMask);
fuelGaugeRegisterValue |= ( changeMask & valueMask);
*fuelGaugeRegister = fuelGaugeRegisterValue;
// code to release mutex goes here...
}
. . .
void SetFuelGaugeFromLevel(unsigned byte currentLevel)
if ( currentLevel == 0xFF ) {
UpdateFuelGauge( TANK_LIGHTS_MASK, TANK_LIGHTS_MASK );
}
else if (level >= 0x03 ) {
UpdateFuelGauge( TANK_LIGHTS_MASK, (TANK_HIGH | TANK_LOW | TANK_NOTEMPTY) );
}
else if (level >= 0x02 ) {
UpdateFuelGauge( TANK_LIGHTS_MASK, (TANK_LOW | TANK_NOTEMPTY) );
}
else if (level > 0x01 ) {
UpdateFuelGauge( TANK_LIGHTS_MASK, TANK_NOTEMPTY );
}
else {
UpdateFuelGauge( TANK_LIGHTS_MASK, 0 );
}
}
其他一些说明:
尝试以一种方式命名位和标准掩码,以便在“断言”时对该位的含义进行有根据的猜测。例如,“EMPTY_FLAG”会让您猜测“1”是否为“空”,“非空”。
Wikipedia has an article on signal masking使用了一些术语,但目前确实提到了任何命名约定。