2012-02-01 50 views
5

如果我想編寫一個線程安全的方法來同時設置和清除一些內部位,我可以用兩個參數來實現:要修改的內部位的32位掩碼,以及指示是否要將由第一個參數指定的內部位設置爲0或1.位掩碼參數命名約定?

命名這兩個參數的約定是什麼?

+1

面膜和價值怎麼樣? – TJD 2012-02-02 00:43:07

回答

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()函數的一個問題是它創建了同時設置和清除同一位的可能性,這是沒有意義的。防止這種情況需要DBC,它在C++中在運行時進行評估。最好不要設置和清除相同的位,這就是「掩碼」和「值」(或其他所謂的)實現的位置。 – traal 2012-02-24 23:12:02

+0

@Traal - 感謝您指出了這一點。你是對的。 ChangeMask()是一個在嚴格控制的狀態引擎中使用的本地函數,但是我發現使用它的問題。我會很快編輯我的答案(除非有人打我......) – 2012-02-25 01:02:32