2013-07-22 6 views
5

मैं एक एम्बेडेड सी डेवलपर हूं जिसने हाल ही में एक एम्बेडेड डिवाइस पर सी ++ कोड के साथ गड़बड़ करना शुरू कर दिया है और इस बारे में अनिश्चित हूं कि क्लास अस्थिर डेटा जैसे स्मृति के रूप में कैसे उपयोग करता है एक बाहरी डिवाइस पर मैप किए गए रजिस्ट्रार या डेटा, जैसे एनालॉग-टू-डिजिटल कनवर्टर (एडीसी)।सी ++ अस्थिर और बाहरी डेटा एसेस के साथ कॉन्स्ट-शुद्धता

उदाहरण के लिए, मैं एक सूचक के माध्यम से अपनी स्मृति-मैप किया रजिस्टरों एक्सेस करके कक्षाएं डिवाइस के हार्डवेयर मॉड्यूल है कि इंटरफेस है, तो जैसे:

class IOPin 
{ 
public: 
    /* Constructor, destructor, other methods...*/ 

    // should this be a const method? 
    bool ReadIOState() {return portregs_->state;} 

private: 
    /* Other private stuff...*/ 

    // Constructor points this to the right set of memory-mapped registers 
    volatile struct portregs_t 
    { 
     uint32_t control; 
     uint32_t state; 
     uint32_t someotherreg; 
    } *portregs_; 
}; 

रजिस्टर नाम निश्चित रूप से की खातिर बने होते हैं उदाहरण। मैं किसी भी व्यक्ति के लिए माइक्रोचिप पीआईसी 32 डिवाइस का उपयोग कर रहा हूं जो उत्सुक है।

मेरी संभावित गलत समझ से, const विधि को चिह्नित करने का अर्थ है कि ऑब्जेक्ट की देखने योग्य स्थिति को कॉलर के संबंध में तब तक नहीं बदला जाना चाहिए। तो ReadIOState() विधि const हो क्योंकि यह volatile डेटा तक पहुंच सकता है जो किसी भी समय बदल सकता है और इस प्रकार कॉलर परिवर्तन का निरीक्षण करेगा? या यह const होना चाहिए क्योंकि विधि स्पष्ट रूप से कुछ भी नहीं बदल रहा है?

वर्तमान में, मैं प्रश्न में बताए गए कारण के लिए const बनाने की दिशा में झुका रहा हूं। this GotW article पर ठोकर खाने के बाद यह विशेष रूप से सच है, जिसमें कहा गया है कि const का अर्थ "समवर्ती रूप से पढ़ने में सक्षम" है। मेरा एम्बेडेड एप्लिकेशन एकल-थ्रेडेड है, लेकिन मुझे लगता है कि सामान्य रूप से const नेस के लिए एक अच्छा लिटमस परीक्षण हो सकता है।

इसके अलावा, कंपाइलर const विधियों का इलाज कैसे करता है? यही कारण है, क्या होता है जब मैं इस तरह आईओ के राज्य मतदान करना चाहते हैं:

// wait for IO pin to go high 
while(!myIOpin.ReadIOState()) 
{} 

तो ReadIOState()const है, तो संकलक एक कॉल के बाद दिए गए मान पुन: उपयोग या यह बहुत चालाक को देखने के लिए यह है कि कर सकते हैं volatile डेटा तक पहुंच रहा है और ऐसा नहीं?

+0

मुझे आश्चर्य है कि क्या आप अस्थिर तरीकों को उसी तरह बना सकते हैं जैसे आप कॉन्स्ट विधियां बना सकते हैं। –

+1

शून्य परीक्षण() अस्थिर {} VS2012 पर संकलित करता है लेकिन मुझे नहीं पता कि इसका क्या अर्थ है क्योंकि मैंने कभी पहले अस्थिरता का उपयोग नहीं किया है। –

+1

@NeilKirk हां, आप इसे कर सकते हैं। इसका मतलब है कि फ़ंक्शन को 'अस्थिर' उदाहरण पर लागू किया जा सकता है। 'कॉन्स्ट' उदाहरणों पर' कॉन्स्ट 'फ़ंक्शंस की तरह ही लगाया जा सकता है। यदि आपको ऐसा लगता है तो आप सदस्य फ़ंक्शन के सभी 4 अधिभार भी प्राप्त कर सकते हैं। – Angew

उत्तर

2

आप कक्षा के अंदर संरचना के लिए पॉइंटर रखते हैं और आप सूचक को नहीं बदलते हैं, इसलिए विधि का आधार हो सकता है। कंपाइलर को पिछले कॉल से मूल्य का पुन: उपयोग नहीं करना चाहिए, यह काफी स्मार्ट है।

+0

प्रतिक्रिया के लिए धन्यवाद! यह सच है और मैं खुद को याद दिलाना जारी रखता हूं कि यह सूचक ही है जिसे बनाया जा रहा है। हालांकि, मुझे लगता है कि मेरा प्रश्न दार्शनिक पक्ष पर थोड़ा और है। यानी, विधि के लिए कॉन्स्ट का उपयोग विधि के वापसी मूल्य के बारे में कुछ भी बताता है? यदि रिटर्न वैल्यू दो लगातार कॉलों के बीच एक विधि में बदल सकता है, भले ही कक्षा उन्हें बदलने वाले व्यक्ति न हों, तो क्या यह कहना समझ में आता है कि यह स्थिर है? –

+0

कॉन्स एक ऐसा कीवर्ड है जिसका उपयोग केवल संकलन समय पर किया जाता है, रन टाइम पर किसी विशेष जांच को कॉन्स्ट से संबंधित नहीं किया जाता है (केवल अगर किसी के पास भाग्य और कॉन्स वैल्यू ओएस द्वारा रीड-ओनली मेमोरी पेज पर संग्रहीत होता है), तो यह कीवर्ड केवल इस्तेमाल होता है संकलन समय पर संकलक से अधिक सहायता (संकलन त्रुटियों) के लिए। विधि के लिए कॉन्स का उपयोग विधि के वापसी मूल्य के बारे में कुछ भी नहीं दर्शाता है। यह सी ++ की कम सहज पक्ष है। – lextiz

+0

गोटो, धन्यवाद! –

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