gpt4 book ai didi

c - 位掩码参数命名约定?

转载 作者:太空狗 更新时间:2023-10-29 15:07:33 24 4
gpt4 key购买 nike

如果我想写一个同时设置和清除一些内部位的线程安全方法,我可能会用两个参数来实现:一个 32 位掩码来修改内部位,一个 32 位掩码指示是否将第一个参数指定的内部位设置为 0 或 1。

这两个参数的命名约定是什么?

最佳答案

虽然我工作过的很多地方都有命名标准等,但我没有听说过任何整体标准

掩码中的每一位都单独定义,例如:

#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它使用了一些术语,但目前它确实提到了任何命名约定。

关于c - 位掩码参数命名约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9104839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com