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();
}

दो सवाल:

  1. क्या रुकावट एक संकेत है?
  2. क्या उपरोक्त कोड अपरिभाषित व्यवहार का एक उदाहरण है, क्योंकि state volatile नहीं है?
4
Cheiron 26 मार्च 2020, 12:25
आप उन "रुकावट संचालकों" को कैसे स्थापित करते हैं? यदि आप इसके लिए signal का उपयोग करते हैं, तो ये मानक के अर्थ में सिग्नल हैंडलर हैं और फिर हां आपको संचार के लिए केवल volatile sigatomic_t का उपयोग करना चाहिए। यदि यह एक सिस्टम विशिष्ट कार्यों का सेट है, तो आपने उस दस्तावेज़ीकरण को भी देखा होगा, सी मानक आपको इसके बारे में कोई नहीं बता सकता है।
 – 
Jens Gustedt
26 मार्च 2020, 12:56
जैसा कि प्रश्न में कहा गया है, यह एम्बेडेड सिस्टम के बारे में है (मैं इसे और अधिक स्पष्ट करने के लिए टैग जोड़ूंगा), यह सचमुच प्रोसेसर है जो यह तय कर रहा है कि अब हम इस फ़ंक्शन को चलाने जा रहे हैं क्योंकि कुछ घटना हुई
 – 
Cheiron
26 मार्च 2020, 13:19
हम केवल यह मान सकते हैं कि सी भाषा एक विशेष उपकरण पर चलने के लिए है जिसमें ओपी कोड निर्देश, असेंबलर भाषा या इंटरप्ट नहीं है। अन्यथा भाषा में कंप्यूटर के लिए मानक समर्थन होगा। यहां तक ​​​​कि सी ++ इनलाइन असेंबलर का समर्थन करता है, लेकिन सी नहीं।
 – 
Lundin
26 मार्च 2020, 13:41
शुद्ध व्यावहारिक दृष्टिकोण से: चूंकि दिखाया गया कोड चर को केवल एक ही थ्रेड से एक्सेस करता है (और ISR और जिस फ़ंक्शन को वह कॉल करता है वह एक प्रकार का थ्रेड है), मुझे इसे बनाने की कोई आवश्यकता नहीं दिखती volatile या परमाणु। यह कहने के बाद, आपको यह सुनिश्चित करने की आवश्यकता है कि जब ISR या कोई भी कॉल किया जाने वाला फ़ंक्शन चलता है, तो उसे फिर से नहीं कहा जा सकता है। यह अधिकांश एम्बेडेड सिस्टम पर मानक है, लेकिन आप इसे कर सकते हैं। और आपको यह सुनिश्चित करने की ज़रूरत है कि कोई अन्य थ्रेड (जैसे main() और इसके कॉल किए गए फ़ंक्शन) इस चर का उपयोग नहीं करता है।
 – 
the busybee
26 मार्च 2020, 15:07

2 जवाब

सबसे बढ़िया उत्तर

शब्द "सिग्नल" एक विशिष्ट चीज को संदर्भित करता है जिसका व्यवहार मानक (सी 11 7.14 "सिग्नल हैंडलिंग") द्वारा परिभाषित किया गया है; उस परिभाषा में यह शामिल है कि सिग्नल में एक संख्या है, और signal फ़ंक्शन द्वारा स्थापित एक हैंडलर पर कूदकर निष्पादन को बाधित कर सकता है, और इसी तरह।

मानक सिग्नल और थ्रेड्स के अलावा किसी अन्य प्रकार के एसिंक्रोनस कोड निष्पादन को कवर नहीं करता है।

यदि आपका कार्यान्वयन किसी अन्य प्रकार की बाधा प्रदान करता है जो संकेतों के विनिर्देश का पालन नहीं करता है, और इंटरप्ट हैंडलर सार मशीन के व्यवहार को बदलता है, तो हम या तो कह सकते हैं कि कार्यान्वयन गैर-अनुरूप है, या कोड स्थापित करने के लिए सिग्नल हैंडलर अपरिभाषित व्यवहार का कारण बनता है।

अच्छी तरह से परिभाषित होने के लिए आप अस्थिर परमाणु चर लिखने के अलावा हैंडलर कुछ भी नहीं कर सकते हैं।

तो, आपका दूसरा प्रश्न मानक के दायरे से बाहर है। मानक सी में ऑप्टिमाइज़र उन सभी कार्यों को अप्रयुक्त के रूप में हटा सकता है यदि उन्हें प्रोग्राम द्वारा कभी नहीं बुलाया जाता है।

हकीकत में एक कार्यान्वयन जो गैर-मानक इंटरप्ट प्रदान करता है, वह अपने स्वयं के व्यवहार को अपने दायरे में परिभाषित करेगा, और आप इसे उस अतिरिक्त कार्यक्षमता के साथ सी की विस्तारित बोली मान सकते हैं।

2
M.M 26 मार्च 2020, 13:55
तो मानक के अनुसार संकेत क्या है?
 – 
Cheiron
26 मार्च 2020, 13:35
यह उल्लेख करता है 5.2.3 Signals and interrupts
 – 
0___________
26 मार्च 2020, 13:39
यदि आप 5.2.3 "सिग्नल और इंटरप्ट" का उल्लेख करते हैं, तो यह एक सिग्नल द्वारा बाधित होने वाले निष्पादन को संदर्भित करता है। सिग्नल के अलावा किसी अन्य प्रकार का व्यवधान मानक द्वारा कवर नहीं किया जाता है।
 – 
M.M
26 मार्च 2020, 13:41
Functions shall be implemented such that theymay be interrupted at anytime by a signal रुकावट का कोई भी स्रोत एक संकेत है।
 – 
0___________
26 मार्च 2020, 13:43
वास्तव में औपचारिक परिभाषा नहीं है। सी भाषा में एक "सिग्नल", कुछ ऐसा है जो अमूर्त पुस्तकालय सिग्नल का उपयोग करता है। एच। एक "अनुरूप फ्रीस्टैंडिंग कार्यान्वयन" (पढ़ें: एम्बेडेड सिस्टम कंपाइलर) को सिग्नल के लिए समर्थन प्रदान करने की आवश्यकता नहीं है। यह वैकल्पिक है।
 – 
Lundin
26 मार्च 2020, 13:45

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

एक गुणवत्ता कार्यान्वयन जो किसी विशेष प्लेटफॉर्म पर निम्न-स्तरीय प्रोग्रामिंग के लिए उपयुक्त होने के लिए डिज़ाइन किया गया है, से अपेक्षा की जानी चाहिए कि या तो प्लेटफॉर्म के एब्स्ट्रैक्शन मॉडल के किसी भी हिस्से को शामिल करने के लिए सी स्टैंडर्ड में दिए गए कंकाल एब्स्ट्रैक्शन मॉडल का विस्तार किया जाए जो उस उद्देश्य के लिए उपयोगी होगा, या अन्यथा करने के लिए एक ठोस कारण दस्तावेज, लेकिन कार्यान्वयन की गुणवत्ता के मुद्दे मानक के अधिकार क्षेत्र से बाहर हैं। मानक द्वारा विचार किए गए मामलों से परे मामलों में उपयोगी रूप से काम करने की उम्मीद की जानी चाहिए या नहीं, यह इस बात पर निर्भर करता है कि क्या इसके डिजाइनर इसे निम्न-स्तरीय प्रोग्रामिंग कार्यों की एक विस्तृत श्रृंखला के लिए उपयुक्त बनाने में रुचि रखते थे, या केवल मानक द्वारा विचार किए गए उद्देश्यों के लिए उपयुक्तता में रुचि रखते थे। .

0
supercat 1 अप्रैल 2020, 00:10