2012-02-01 19 views
5

यदि मैं एक थ्रेड-सुरक्षित विधि लिखना चाहता हूं जो एक साथ कुछ आंतरिक बिट्स को सेट और साफ़ करता है, तो मैं इसे दो तर्कों के साथ कर सकता हूं: आंतरिक बिट्स का 32-बिट मुखौटा संशोधित करने के लिए, और 32-बिट मास्क इंगित करता है कि क्या पहले पैरामीटर द्वारा निर्दिष्ट 0 या 1.बिटमैस्क पैरामीटर नामकरण सम्मेलन?

इन दो पैरामीटर नामकरण के लिए सम्मेलन क्या है?

+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" आपको अनुमान लगाता है कि "खाली" का अर्थ "खाली नहीं" है, "खाली नहीं"।

Wikipedia has an article on signal masking जो कुछ शब्दावली का उपयोग करता है, लेकिन वर्तमान में यह किसी भी नामकरण सम्मेलनों का उल्लेख करता है।

+1

आपके ChangeMask() फ़ंक्शन के साथ एक समस्या यह है कि यह एक ही समय में एक ही बिट को सेट करने और साफ़ करने की संभावना बनाता है, जो समझ में नहीं आता है। उस मामले को रोकने के लिए डीबीसी की आवश्यकता होती है, जिसे सी ++ में रनटाइम पर मूल्यांकन किया जाता है। एक ही बिट को सेट करना और साफ़ करना असंभव बनाना बेहतर होगा, जो कि "मास्क" और "वैल्यू" (या जिसे वे कहते हैं) प्राप्त करते हैं। – traal

+0

@Traal - इसे इंगित करने के लिए धन्यवाद। तुम सही हो। चेंजमास्क() एक घर से उगाया गया फ़ंक्शन था जो कड़े नियंत्रित राज्य इंजन में उपयोग किया जाता था, लेकिन मुझे इसका उपयोग करने में समस्या दिखाई देती है। मैं जल्द ही अपना जवाब संपादित करूंगा (जब तक कि कोई मुझे इसके लिए धड़कता नहीं है ... –

संबंधित मुद्दे