2012-02-01 36 views
5

内部ビットの設定とクリアを同時に行うスレッドセーフなメソッドを記述したい場合は、変更する内部ビットの32ビットマスクと、変更する内部ビットの32ビットマスクの2つの引数を使用します。最初のパラメータで指定された内部ビットを0または1に設定します。ビットマスクパラメータ命名規則?

これらの2つのパラメータの命名規則はどのようなものですか。

私が命名の基準を持っていた働いている多くの場所が、私は、任意の全体的な基準で聞いていない
+1

マスクと値段はどうですか? – TJD

答えて

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いくつかの用語を使用していますが、現在のところ、命名規則については言及していません。

+1

ChangeMask()関数の問題は、同じビットを同時に設定してクリアする可能性を作成することです。意味はありません。そのようなケースを防ぐには、C++で実行時に評価されるDBCが必要です。 「マスク」と「値」(またはそれらが呼び出されるもの)が達成するものと同じビットを設定してクリアすることを不可能にする方がよいでしょう。 – traal

+0

@Traal - これを指摘してくれてありがとう。あなたは正しいです。 ChangeMask()は、緊密に制御された状態エンジンで使用される自宅で作成された関数ですが、これを使用することで問題が発生します。私はすぐに私の答えを編集する(誰かがそれに私を打つことがない限り... –