2012-02-01 9 views
5

Si quiero escribir un método seguro para subprocesos que establezca y borre al mismo tiempo algunos bits internos, podría hacerlo con dos argumentos: una máscara de 32 bits de los bits internos para modificar y una máscara de 32 bits que indique si establecer los bits internos especificados por el primer parámetro en 0 o 1.Convenciones de nomenclatura de parámetros de máscara de bits?

¿Cuál es la convención para nombrar estos dos parámetros?

+1

¿qué tal máscara y valor? – TJD

Respuesta

2

no he oído hablar de cualquier punto de vista general, aunque muchos lugares que he trabajado han tenido estándares de nomenclatura, etc.

Cada bit de la máscara se define de forma individual, por ejemplo:

#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) 

Para nombres de las funciones -

SET_ON(unsigned setMask), SET_OFF(unsigned clearMask) 

para actualizar bits específicos en un registro:

Update(changeMask, valueMask) 

donde ChangeMask contiene los bits que desea actualizar, a 1, y valueMask contiene los bits de los valores que se desea establecer.

Se podría usarlos como el código para un monitor indicador de combustible incrustada:

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); 
    } 
} 

Algunas otras notas:

Trate de nombrar los bits y máscaras estándar de manera que se puede hacer una educada Adivina qué significaría el bit cuando se "afirme". Por ejemplo, "EMPTY_FLAG" te hace adivinar si "1" significa "vacío", "no está vacío".

Wikipedia has an article on signal masking que utiliza cierta terminología, pero actualmente menciona cualquier convención de nomenclatura.

+1

Un problema con la función ChangeMask() es que crea la posibilidad de establecer y borrar el mismo bit al mismo tiempo, lo cual no tiene sentido. La prevención de ese caso requiere DBC, que en C++ se evalúa en tiempo de ejecución. Sería mejor hacer imposible establecer y borrar el mismo bit, que es lo que logran "máscara" y "valor" (o como se les llame). – traal

+0

@Traal - gracias por señalar esto. Estás en lo correcto. ChangeMask() era una función local utilizada en un motor de estado bien controlado, pero veo el problema con el uso de esto. Editaré mi respuesta pronto (a menos que alguien me gane ... –

Cuestiones relacionadas