क्या अस्थिर की आवश्यकता है जब चर को> 1 ISRs से एक्सेस किया जाता है, लेकिन ISR के बाहर साझा नहीं किया जाता है?


9

यह स्पष्ट रूप से प्रलेखित है कि जब वैश्विक डेटा को आईएसआर और मुख्य कार्यक्रम के साथ साझा किया जाता है, तो volatileमेमोरी दृश्यता की गारंटी देने के लिए डेटा को घोषित करने की आवश्यकता होती है (और यह केवल 1-बाइट डेटा के लिए पर्याप्त है; कुछ बड़ी चीजों को भी परमाणुता की गारंटी के लिए विशेष व्यवस्था की आवश्यकता होती है) । यहाँ हमारे पास अच्छे नियम हैं:

  • केवल ISR के बाहर उपयोग किए जाने वाले चर अस्थिर नहीं होने चाहिए।
  • केवल एक ISR के अंदर उपयोग किए जाने वाले चर अस्थिर नहीं होने चाहिए।
  • एक ISR के अंदर और बाहर दोनों का उपयोग किया जाने वाला चर अस्थिर होना चाहिए।

लेकिन volatileजरूरत तब होती है जब वैरिएबल को> 1 ISRs से एक्सेस किया जाता है, लेकिन ISRs के बाहर साझा नहीं किया जाता है? उदाहरण के लिए, मेरे पास एक फ़ंक्शन है जो एक staticचर का उपयोग करके आंतरिक स्थिति को बनाए रखता है :

void func() {
    static volatile long counter; // volatile or not?
    // Do stuff with counter etc.
}

उस फ़ंक्शन को दो तरीकों से कहा जाता है: पिन इंटरप्ट से, और टिमरऑन लाइब्रेरी से :

  1. attachInterrupt(0, func, CHANGE);
  2. Timer1.attachInterrupt(func);

कोई भी एटमॉसिटी समस्याएं नहीं हैं, जब एक ISR में प्रवेश किया जाता है, तो व्यवधान स्वचालित रूप से अक्षम हो जाते हैं , लेकिन यह volatileएक संकलक का सवाल है: कैश्ड क्या है और क्या नहीं है।

सॉरी से बेहतर सुरक्षित, निश्चित रूप से ...

जवाबों:


9

volatile केवल संकलक के कोड जनरेटर को सूचित करता है कि चर को उत्पन्न होने वाले कोड के अलावा किसी अन्य चीज़ से संशोधित किया जा सकता है, इसलिए यह नहीं मानें कि इसकी कोई भी प्रतिलिपि सटीक बनी हुई है।

ISR कोड को इस धारणा के तहत लिखा / उत्पन्न किया जाना चाहिए कि इसमें प्रविष्टि का कोई संदर्भ नहीं है, और इसके (ISR) के स्वयं के संचालन के आसपास CPU के संदर्भ को संरक्षित करता है। इसलिए, जैसे कि गैर-परमाणु संचालन की अनिश्चितता के साथ, अस्थिरता निर्भर करती है, इस मामले में * , इस बात पर कि क्या घोंसला बनाने की अनुमति है या नहीं। यदि गैर-नेस्टिंग की गारंटी दी जाती है, तो साझा चर अपने स्वयं के निष्पादन के दौरान इस ISR के अलावा अन्य द्वारा नहीं बदल सकता है। यदि किसी दिन आपके ISR का उपयोग ऐसे वातावरण में किया जा सकता है, जहां रुकावटों को घोंसला बनाने की अनुमति है, तो वह बाधा अब नहीं रहेगी।

* इस मामले में :
मैं यहाँ एक सॉफ्टवेयर-अनुरक्षित चर मान रहा हूँ। यदि हम एक ऐसे चर के बारे में बात कर रहे हैं जिसे हार्डवेयर इवेंट द्वारा अपडेट किया जा सकता है, उदाहरण के लिए एक टाइमर रजिस्टर, सभी दांव बंद हैं: चर अस्थिर नहीं है।


इसलिए, जब तक मैं Arduino के डिफ़ॉल्ट "रुकावट नहीं घोंसला बना लेता हूं" व्यवहार को नहीं बदलता है, तब तक चर की आवश्यकता नहीं होती है volatile, क्योंकि यह कोड उत्पन्न होने के अलावा और कुछ भी संशोधित नहीं होता है; संकलक "मान सकता है" कि ISR रैखिक रूप से निष्पादित करता है, और यह तब तक करता है, जब तक कि बीच में घोंसला नहीं बनता। यह समझ आता है। धन्यवाद!
जूनस पुलकका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.