मैं EFM Gekko नियंत्रकों (http://energymicro.com/) का उपयोग करके बैटरी-संचालित सॉफ़्टवेयर विकसित करने में लगा रहा हूं और जब भी ऐसा करने के लिए उपयोगी कुछ नहीं हो तो सोते समय नियंत्रक चाहेंगे। इस उद्देश्य के लिए WFI (इंट्रस्ट के लिए प्रतीक्षा करें) निर्देश का उपयोग किया जाता है; यह प्रोसेसर को तब तक सोने के लिए रखेगा जब तक कोई व्यवधान नहीं होता।
अगर नींद किसी जगह पर जमा हो रही है, तो कुछ ऐसा करने के लिए लोड-एक्सक्लूसिव / स्टोर-एक्सक्लूसिव ऑपरेशन का उपयोग कर सकते हैं:
// NOT_sleep 2 के साथ लोड हो जाता है किसी भी समय ऐसा होता है // मुख्य लूप को कम से कम एक बार चक्र करने के लिए मजबूर करना चाहिए। यदि कोई व्यवधान // होता है जो निम्न कथन के दौरान इसे 2 पर रीसेट करने का कारण बनता है, // व्यवहार ऐसा होगा जैसे इसके बाद व्यवधान हुआ। store_exclusive (load_exclusive (NOT_sleep) >> 1); जबकि (! dont_sleep) { // यदि अगले कथन और store_exclusive के बीच में व्यवधान होता है, तो सोएं नहीं load_exclusive (SLEEP_TRIGGER); अगर (!__leleep) store_exclusive (SLEEP_TRIGGER); }
अगर load_exclusive और store_exclusive कार्रवाइयों के बीच कोई बाधा उत्पन्न होती है, तो प्रभाव store_exclusive को छोड़ना होगा, इस प्रकार सिस्टम लूप के माध्यम से एक और बार चल सकता है (यह देखने के लिए कि क्या अंतर ने NOT_leepep सेट किया है)। दुर्भाग्य से, स्लीप मोड को ट्रिगर करने के लिए गीकको एक डब्ल्यूएफआई निर्देश के बजाय एक लिखित पते का उपयोग करता है; कोड लिखना पसंद है
अगर (!__leleep) डब्ल्यूएफआई ();
जोखिम उठाएँगे कि 'if' और 'wfi' के बीच एक व्यवधान उत्पन्न हो सकता है और NOT_sleep सेट कर सकते हैं, लेकिन wfi आगे बढ़ेगा और वैसे भी निष्पादित होगा। इसे रोकने के लिए सबसे अच्छा पैटर्न क्या है? WFI निष्पादित करने से ठीक पहले प्रोसेसर को बाधित करने से रोकने के लिए PRIMASK को 1 पर सेट करें, और इसके तुरंत बाद साफ़ करें? या कुछ बेहतर ट्रिक है?
संपादित करें
मैं इवेंट बिट के बारे में सोच रहा हूँ। सामान्य विवरण के अनुसार, यह बहु-प्रोसेसर समर्थन के लिए अभिप्रेत है, लेकिन यह सोचता है कि क्या निम्नलिखित की तरह कुछ काम कर सकता है:
अगर (नॉट_सलीप) SEV (); / * निम्नलिखित WFE स्पष्ट घटना ध्वज बना देगा लेकिन नींद नहीं / * WFE ();
हर बाधा जो सेट नहीं करती है, वह भी एक SEV निर्देश को निष्पादित करना चाहिए, इसलिए यदि "अगर" परीक्षण के बाद रुकावट होती है, तो WFE ईवेंट ध्वज को साफ़ कर देगा, लेकिन सो नहीं जाएगा। क्या यह एक अच्छे प्रतिमान की तरह लगता है?