Соглашения об именовании параметров битовой маски? - PullRequest
5 голосов
/ 02 февраля 2012

Если я хочу написать потокобезопасный метод, который одновременно устанавливает и очищает некоторые внутренние биты, я могу сделать это с двумя аргументами: 32-битная маска внутренних битов для изменения и 32-битная маска, указывающая, установить внутренние биты, указанные первым параметром, в 0 или 1.

Какое соглашение для именования этих двух параметров?

1 Ответ

2 голосов
/ 02 февраля 2012

Я не слышал о каких-либо общих стандартах, хотя во многих местах, где я работал, были стандарты именования и т. Д.

Каждый бит в маске определяется индивидуально, например:

#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» «пусто» или «не пусто».

В Википедии есть статья о маскировании сигналов , в которой используется некоторая терминология, но в настоящее время в ней упоминаются любые соглашения об именах.

...