位掩码参数命名约定?

sni*_*ils 5 c naming-conventions

如果我想编写一个同时设置和清除某些内部位的线程安全方法,我可以使用两个参数:一个32位掩码修改内部位,一个32位掩码指示是否设置第一个参数指定的内部位为0或1.

命名这两个参数的惯例是什么?

Jay*_*ton 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 )
Run Code Online (Sandbox Code Playgroud)

对于函数名称——

SET_ON(unsigned setMask), SET_OFF(unsigned clearMask)
Run Code Online (Sandbox Code Playgroud)

要更新寄存器中的特定位:

Update(changeMask, valueMask)
Run Code Online (Sandbox Code Playgroud)

其中,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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

其他一些注意事项:

尝试以一种方式来命名位和标准掩码,以便您可以有根据地猜测该位在“断言”时的含义。例如,“EMPTY_FLAG”让您猜测“1”是否表示“空”或“非空”。

维基百科有一篇关于信号屏蔽的文章,其中使用了一些术语,但目前它确实提到了任何命名约定。