如果我想編寫一個線程安全的方法來同時設置和清除一些內部位,我可以用兩個參數來實現:要修改的內部位的32位掩碼,以及指示是否要將由第一個參數指定的內部位設置爲0或1.位掩碼參數命名約定?
命名這兩個參數的約定是什麼?
如果我想編寫一個線程安全的方法來同時設置和清除一些內部位,我可以用兩個參數來實現:要修改的內部位的32位掩碼,以及指示是否要將由第一個參數指定的內部位設置爲0或1.位掩碼參數命名約定?
命名這兩個參數的約定是什麼?
我還沒有聽說過任何整體的標準,雖然很多地方我曾曾命名標準等
在掩碼中的每一位被單獨定義,例如:
#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它使用一些術語,但目前它確實提到了任何命名約定。
ChangeMask()函數的一個問題是它創建了同時設置和清除同一位的可能性,這是沒有意義的。防止這種情況需要DBC,它在C++中在運行時進行評估。最好不要設置和清除相同的位,這就是「掩碼」和「值」(或其他所謂的)實現的位置。 – traal 2012-02-24 23:12:02
@Traal - 感謝您指出了這一點。你是對的。 ChangeMask()是一個在嚴格控制的狀態引擎中使用的本地函數,但是我發現使用它的問題。我會很快編輯我的答案(除非有人打我......) – 2012-02-25 01:02:32
面膜和價值怎麼樣? – TJD 2012-02-02 00:43:07