2014-10-20 2 views
6

मेरे पास AVR32 पर एक इंटरप्ट सेवा रूटिंग है। मुझे बाधा को रद्द करने के लिए इंटरप्ट स्थिति रजिस्टर से पढ़ने की जरूरत है। हालांकि मैं पढ़ने के परिणाम का उपयोग नहीं करता हूं। मैं एएसएम निर्देश का उपयोग नहीं करना चाहूंगा, लेकिन मुझे चिंता है कि जीसीसी एक डमी चर में पढ़ने को अनुकूलित करेगा। सही तरीका क्या है?सी/जीसीसी का उपयोग करके परिधीय आईओ रजिस्टर से कोई कैसे पढ़ता है?

वर्तमान में मेरे पास है:

uint32_t tmp = *(volatile uint32_t *)INTERRUPT_STATUS_REG_ADDRESS; 

भी tmp चाहिए अस्थिर हो? मुझे चिंता है कि अगर टीएमपी का उपयोग नहीं किया जाता है तो जीसीसी सिर्फ पढ़ने को छोड़ देगा।

+0

मैं एवीआर 32 से परिचित नहीं हूं, लेकिन क्या आपको यकीन है कि आपको इंटरप्ट स्थिति रजिस्टर पढ़ना होगा? मेरे अनुभव से, आपको संबंधित रजिस्टर के भीतर केवल एक इंटरप्ट फ्लैग साफ़ करना होगा (अक्सर संबंधित बिट में 1 लिखकर पूरा किया जाता है)। इसके अलावा, इसके लिए आपका उपयोग केस क्या है? –

+0

हां यह आईआरक्यू को साफ़ करने के लिए पीडब्लूएम तुलना स्थिति रजिस्टर का सिर्फ एक पठन है। 'uint32_t temp = AVR32_PWM.isr2;' – Robotbugs

उत्तर

6

पॉइंटर कास्ट (अस्थिर 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 पर स्थित में दर्ज किए जाएंगे;

+0

धन्यवाद, यह कोड का एक टुकड़ा देखने के लिए विचित्र है जो ऐसा कुछ नहीं लगता है। मुझे सच में यकीन नहीं था कि ऐसी चीज काम कर सकती है। – Robotbugs

+1

हां, यह अजीब लगता है, इसलिए परिधीय रजिस्टरों को पढ़ने के लिए व्याख्यात्मक नाम के साथ कम से कम एक मैक्रो या फ़ंक्शन लिखना अच्छा होता है। – dbrank0

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