पॉइंटर कास्ट (अस्थिर uint32_t *) के माध्यम से इंटरप्ट स्टेटस रजिस्टर पढ़ना संकलक बताता है कि इस अभिव्यक्ति को पढ़ने (निर्दिष्ट पते पर चर) साइड इफेक्ट्स उत्पन्न करता है, इसलिए इसे हमेशा इस अभिव्यक्ति का मूल्यांकन करने की आवश्यकता होती है।
चूंकि आपका टीएमपी वैरिएबल अस्थिर नहीं है, इसलिए कंपाइलर आपके रजिस्टर के मूल्य को परिवर्तनीय रूप से संग्रहीत करने के लिए अनुकूलित है।
मुझे लगता है कि सी मानक (see here) का अध्याय 5.1.2.3 पर्याप्त प्रासंगिक है।
इसके अतिरिक्त अध्याय 6.7.3 बताते हैं:
एक वस्तु है कि अस्थिर योग्य प्रकार कार्यान्वयन के लिए अज्ञात या अन्य अज्ञात दुष्प्रभाव हो तरीकों से संशोधित किया जा सकता है। इसलिए ऐसी किसी ऑब्जेक्ट को का संदर्भ देने वाली किसी भी अभिव्यक्ति का मूल्यांकन अमूर्त मशीन, के नियमों के अनुसार कड़ाई से मूल्यांकन किया जाएगा जैसा कि 5.1.2.3 में वर्णित है। इसके अलावा, प्रत्येक अनुक्रम बिंदु पर ऑब्जेक्ट में संग्रहीत मूल्य अमूर्त मशीन द्वारा निर्धारित अनुसार सहमत होगा, जैसा कि द्वारा संशोधित अज्ञात कारकों के अनुसार संशोधित किया गया है। 116) में ऑब्जेक्ट तक पहुंच का गठन क्या अस्थिर-योग्य प्रकार कार्यान्वयन-परिभाषित है।
आप वास्तव में tmp छोड़ सकते हैं और बस लिखना:
*(volatile uint32_t *)INTERRUPT_STATUS_REG_ADDRESS;
यह केवल पढ़ने uint32_t INTERRUPT_STATUS_REG_ADDRESS पर स्थित में दर्ज किए जाएंगे;
मैं एवीआर 32 से परिचित नहीं हूं, लेकिन क्या आपको यकीन है कि आपको इंटरप्ट स्थिति रजिस्टर पढ़ना होगा? मेरे अनुभव से, आपको संबंधित रजिस्टर के भीतर केवल एक इंटरप्ट फ्लैग साफ़ करना होगा (अक्सर संबंधित बिट में 1 लिखकर पूरा किया जाता है)। इसके अलावा, इसके लिए आपका उपयोग केस क्या है? –
हां यह आईआरक्यू को साफ़ करने के लिए पीडब्लूएम तुलना स्थिति रजिस्टर का सिर्फ एक पठन है। 'uint32_t temp = AVR32_PWM.isr2;' – Robotbugs