C11 5.1.2.3/5:
जब एक संकेत की प्राप्ति से अमूर्त मशीन का प्रसंस्करण बाधित होता है, तो वस्तुओं के मूल्य जो न तो लॉक-फ्री परमाणु वस्तुएं हैं और न ही प्रकार के अस्थिर sig_atomic_t अनिर्दिष्ट हैं, जैसा कि फ़्लोटिंग-पॉइंट वातावरण की स्थिति है। हैंडलर द्वारा संशोधित किसी भी वस्तु का मूल्य जो न तो लॉक-फ्री परमाणु वस्तु है और न ही अस्थिर sig_atomic_t प्रकार का है, जब हैंडलर बाहर निकलता है, तो फ्लोटिंग-पॉइंट वातावरण की स्थिति के रूप में अनिश्चित हो जाता है यदि इसे हैंडलर द्वारा संशोधित किया जाता है और बहाल नहीं किया जाता है अपनी मूल स्थिति में।
यह प्रश्न विशेष रूप से एम्बेडेड सिस्टम के बारे में है, ऐसी स्थिति में जहां कोई ऑपरेटिंग सिस्टम जैसा सेटअप नहीं है।
एक एम्बेडेड सिस्टम पर क्लासिक सिग्नल (POSIX शैली) मौजूद नहीं हैं। मान लें कि हमारे पास एक इंटरप्ट है जो कई कार्यों को कॉल करता है, जिनमें से सभी एक ही ((अर्ध-) वैश्विक) चर पर काम करते हैं, लेकिन इस चर का उपयोग आउट-ऑफ-इंटरप्ट संदर्भ से नहीं किया जाता है। कुछ इस तरह
static enum State state;
static void setStateTo1(void)
{
state = stateOne;
}
static void setStateTo2(void)
{
state = stateTwo;
}
void ISR(void)
{
if (state == stateOne)
setStateTo2();
else
setStateTo1();
}
दो सवाल:
- क्या रुकावट एक संकेत है?
- क्या उपरोक्त कोड अपरिभाषित व्यवहार का एक उदाहरण है, क्योंकि
state
volatile
नहीं है?
2 जवाब
शब्द "सिग्नल" एक विशिष्ट चीज को संदर्भित करता है जिसका व्यवहार मानक (सी 11 7.14 "सिग्नल हैंडलिंग") द्वारा परिभाषित किया गया है; उस परिभाषा में यह शामिल है कि सिग्नल में एक संख्या है, और signal
फ़ंक्शन द्वारा स्थापित एक हैंडलर पर कूदकर निष्पादन को बाधित कर सकता है, और इसी तरह।
मानक सिग्नल और थ्रेड्स के अलावा किसी अन्य प्रकार के एसिंक्रोनस कोड निष्पादन को कवर नहीं करता है।
यदि आपका कार्यान्वयन किसी अन्य प्रकार की बाधा प्रदान करता है जो संकेतों के विनिर्देश का पालन नहीं करता है, और इंटरप्ट हैंडलर सार मशीन के व्यवहार को बदलता है, तो हम या तो कह सकते हैं कि कार्यान्वयन गैर-अनुरूप है, या कोड स्थापित करने के लिए सिग्नल हैंडलर अपरिभाषित व्यवहार का कारण बनता है।
अच्छी तरह से परिभाषित होने के लिए आप अस्थिर परमाणु चर लिखने के अलावा हैंडलर कुछ भी नहीं कर सकते हैं।
तो, आपका दूसरा प्रश्न मानक के दायरे से बाहर है। मानक सी में ऑप्टिमाइज़र उन सभी कार्यों को अप्रयुक्त के रूप में हटा सकता है यदि उन्हें प्रोग्राम द्वारा कभी नहीं बुलाया जाता है।
हकीकत में एक कार्यान्वयन जो गैर-मानक इंटरप्ट प्रदान करता है, वह अपने स्वयं के व्यवहार को अपने दायरे में परिभाषित करेगा, और आप इसे उस अतिरिक्त कार्यक्षमता के साथ सी की विस्तारित बोली मान सकते हैं।
5.2.3 Signals and interrupts
Functions shall be implemented such that theymay be interrupted at anytime by a signal
रुकावट का कोई भी स्रोत एक संकेत है।
मानक के लेखकों ने कई चीजों को उनके अधिकार क्षेत्र से बाहर माना। यदि एक कार्यान्वयन इस तरह से स्टैक का उपयोग करना था जो प्रोग्राम निष्पादन के दौरान कोई बाधा उत्पन्न होने पर अप्रत्याशित रूप से खराब हो जाएगा, और इसके परिणामस्वरूप आवश्यक कोड केवल उन परिस्थितियों में चलाया जाना चाहिए जहां कोई इंटरप्ट नहीं हो सकता है, ऐसी सीमा नहीं होगी कार्यान्वयन गैर-अनुरूप, हालांकि यह इसे कई उद्देश्यों के लिए अनुपयुक्त बना देगा।
एक गुणवत्ता कार्यान्वयन जो किसी विशेष प्लेटफॉर्म पर निम्न-स्तरीय प्रोग्रामिंग के लिए उपयुक्त होने के लिए डिज़ाइन किया गया है, से अपेक्षा की जानी चाहिए कि या तो प्लेटफॉर्म के एब्स्ट्रैक्शन मॉडल के किसी भी हिस्से को शामिल करने के लिए सी स्टैंडर्ड में दिए गए कंकाल एब्स्ट्रैक्शन मॉडल का विस्तार किया जाए जो उस उद्देश्य के लिए उपयोगी होगा, या अन्यथा करने के लिए एक ठोस कारण दस्तावेज, लेकिन कार्यान्वयन की गुणवत्ता के मुद्दे मानक के अधिकार क्षेत्र से बाहर हैं। मानक द्वारा विचार किए गए मामलों से परे मामलों में उपयोगी रूप से काम करने की उम्मीद की जानी चाहिए या नहीं, यह इस बात पर निर्भर करता है कि क्या इसके डिजाइनर इसे निम्न-स्तरीय प्रोग्रामिंग कार्यों की एक विस्तृत श्रृंखला के लिए उपयुक्त बनाने में रुचि रखते थे, या केवल मानक द्वारा विचार किए गए उद्देश्यों के लिए उपयुक्तता में रुचि रखते थे। .
signal
का उपयोग करते हैं, तो ये मानक के अर्थ में सिग्नल हैंडलर हैं और फिर हां आपको संचार के लिए केवलvolatile sigatomic_t
का उपयोग करना चाहिए। यदि यह एक सिस्टम विशिष्ट कार्यों का सेट है, तो आपने उस दस्तावेज़ीकरण को भी देखा होगा, सी मानक आपको इसके बारे में कोई नहीं बता सकता है।volatile
या परमाणु। यह कहने के बाद, आपको यह सुनिश्चित करने की आवश्यकता है कि जब ISR या कोई भी कॉल किया जाने वाला फ़ंक्शन चलता है, तो उसे फिर से नहीं कहा जा सकता है। यह अधिकांश एम्बेडेड सिस्टम पर मानक है, लेकिन आप इसे कर सकते हैं। और आपको यह सुनिश्चित करने की ज़रूरत है कि कोई अन्य थ्रेड (जैसेmain()
और इसके कॉल किए गए फ़ंक्शन) इस चर का उपयोग नहीं करता है।