2016-04-07 10 views
6

मेरे पास माइक्रोकंट्रोलर निर्माता द्वारा प्रदान की गई एक रजिस्टर परिभाषा है जिसे थोड़ा सा क्षेत्र के रूप में संभाला जा सकता है।एक यूआईटी 32 चर को थोड़ा सा क्षेत्र में कास्ट करें - अपरिभाषित व्यवहार?

#define SCU_WDTSCON0 (*(SCU_WDTSCON0_type *) 0xf00360f0u) 

सा क्षेत्र परिभाषा इस तरह दिखता है: रजिस्टर इस प्रकार परिभाषित किया गया है

typedef volatile union { 
unsigned U; 
int I; 
struct { 
    unsigned ENDINIT :1; // [0:0] End-of-Initialization Control Bit 
    unsigned LCK :1; // [1:1] Lock Bit to Control Access to WDTxCON0 
    unsigned HPW0  :2; // [3:2] Hardware Password 0 
    unsigned HPW1  :4; // [7:4] Hardware Password 1 
    unsigned PW :8; // [15:8] User-Definable Password Field for Access to WDTxCON0 
    unsigned REL :16; // [31:16] Reload Value for the WDT 
    } B; 
} SCU_WDTSCON0_type; 

के बजाय सीधे रजिस्टर करने के लिए लिख, मैं पहली बार एक uint32 बफर चर का उपयोग करना चाहते हैं, लेकिन अभी भी हो सकता है रजिस्टर बिट फील्ड परिभाषा के तरीके में इसे संपादित करने में सक्षम।

volatile uint32 buffer_variable; 
SCU_WDTSCON0_type register_buffer = (*(SCU_WDTSCON0_type *) &buffer_variable); 

सका अपरिभाषित व्यवहार को यह नेतृत्व: यह कार्यान्वयन, काम करने के रूप में पता बस & buffer_variable साथ बदल दिया है लगता है?

+0

यह एक अच्छा सवाल है। मेरे दिमाग में इसका परीक्षण करने का तरीका दो आर्किटेक्चर, एक बड़ा एंडियन, एक छोटा एंडियन पर एक ही कोड का प्रयास करना है। मेरे पास ऐसे सिस्टम हैं और यदि कोई निश्चित उत्तर नहीं है तो मेरे पास समय होने पर कुछ कोड संकलित होंगे। –

+1

@ डेविडहोल्जर यह अंतहीनता के साथ बहुत कुछ नहीं है। आप यह नहीं जान सकते कि कैसे एक बिट-फील्ड अंतहीनता के बावजूद अपने बिट्स को स्टोर करता है। बिट-फ़ील्ड का व्यवहार शुरू करने के लिए अच्छी तरह से निर्दिष्ट नहीं है। [इसे देखें] (http://stackoverflow.com/questions/6043483/why-bit-endianness-is-an-issue-in-bitfields/6044223#6044223)। – Lundin

+0

ईमानदारी से, मैं शायद ही कभी उनका उपयोग करता हूं। मैं बस कल्पना कर सकता हूं कि अगर आप उन्हें किसी और चीज में डाल देते हैं तो अंतहीनता का असर हो सकता है। –

उत्तर

3

इस मामले में unsigned में आपके बफर परिवर्तक को यूनियन सदस्यों में से एक जैसा ही होना चाहिए। यदि संकलक uint32 और unsigned को विभिन्न प्रकार के रूप में मानता है, तो यह अपरिभाषित व्यवहार (सख्त एलियासिंग नियम का उल्लंघन करेगा) का कारण बन जाएगा। अन्यथा, यदि वे एक ही प्रकार के हैं, तो कोड ठीक है।

(एक साइड नोट के रूप में, सख्त एलियासिंग उल्लंघनों से संबंधित अधिकांश बग संकलक के अनुकूलक के कारण होते हैं। अस्थिर चर के मामले में, यह एक समस्या से कम है, क्योंकि संकलक को उन्हें अनुकूलित करने की अनुमति नहीं है। इसलिए व्यावहारिक रूप से, मुझे संदेह है कि इस परिदृश्य के लिए आपको कभी भी यूबी का सामना करना पड़ेगा, भले ही यह सिद्धांत में यूबी हो।)

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