मेरे पास माइक्रोकंट्रोलर निर्माता द्वारा प्रदान की गई एक रजिस्टर परिभाषा है जिसे थोड़ा सा क्षेत्र के रूप में संभाला जा सकता है।एक यूआईटी 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 साथ बदल दिया है लगता है?
यह एक अच्छा सवाल है। मेरे दिमाग में इसका परीक्षण करने का तरीका दो आर्किटेक्चर, एक बड़ा एंडियन, एक छोटा एंडियन पर एक ही कोड का प्रयास करना है। मेरे पास ऐसे सिस्टम हैं और यदि कोई निश्चित उत्तर नहीं है तो मेरे पास समय होने पर कुछ कोड संकलित होंगे। –
@ डेविडहोल्जर यह अंतहीनता के साथ बहुत कुछ नहीं है। आप यह नहीं जान सकते कि कैसे एक बिट-फील्ड अंतहीनता के बावजूद अपने बिट्स को स्टोर करता है। बिट-फ़ील्ड का व्यवहार शुरू करने के लिए अच्छी तरह से निर्दिष्ट नहीं है। [इसे देखें] (http://stackoverflow.com/questions/6043483/why-bit-endianness-is-an-issue-in-bitfields/6044223#6044223)। – Lundin
ईमानदारी से, मैं शायद ही कभी उनका उपयोग करता हूं। मैं बस कल्पना कर सकता हूं कि अगर आप उन्हें किसी और चीज में डाल देते हैं तो अंतहीनता का असर हो सकता है। –