यदि किसी प्रोग्राम में रनटाइम त्रुटि होती है, तो क्या होता है? क्या कार्यक्रम का क्रियान्वयन बस रुक जाएगा? क्या कोई रास्ता है जिससे मुझे अर्डुइनो मिल जाए यह बताने के लिए कि त्रुटि क्या है?
यदि किसी प्रोग्राम में रनटाइम त्रुटि होती है, तो क्या होता है? क्या कार्यक्रम का क्रियान्वयन बस रुक जाएगा? क्या कोई रास्ता है जिससे मुझे अर्डुइनो मिल जाए यह बताने के लिए कि त्रुटि क्या है?
जवाबों:
पहले, आइए देखें कि क्या गलत हो सकता है।
void setup() {
int status;
pinMode(13, OUTPUT);
digitalWrite(13, status);
}
जैसा कि टिप्पणी में एडगर बोनेट द्वारा कहा गया है , status
उपरोक्त कोड की तरह स्थानीय चर को मुख्य रूप से सी। डायलर द्वारा प्रारंभ नहीं किया जाता है। तो, ऊपर दिए गए कोड का परिणाम अनिश्चित है। उससे बचने के लिए, सुनिश्चित करें कि आप हमेशा अपने स्थानीय चर को मान प्रदान करते हैं।
वैश्विक और स्थिर चर के साथ चीजें थोड़ी भिन्न हैं:
वैश्विक और स्थिर चर को C मानक द्वारा 0 से आरंभ करने की गारंटी है।
इसका मतलब है कि आपको अपने कोड में उन्हें 0 से शुरू करने के बारे में चिंता नहीं करनी चाहिए। वास्तव में, आपको वास्तव में इससे बचना चाहिए, क्योंकि प्रारंभिककरण स्मृति को बर्बाद कर सकता है। केवल उन्हें 0 से भिन्न मानों के लिए प्रारंभ करें।
int array[10];
int v = array[100];
array[-100] = 10;
यहाँ पहली समस्या यह है कि आप नहीं जानते हैं कि v को क्या सौंपा जाएगा, लेकिन इससे भी बदतर यह है कि आपको पता नहीं है कि आपने असाइनमेंट के साथ स्थिति -100 में क्या गड़बड़ कर दी है array
।
void doSomething( void ) {
for (int i = 0; i < 1000; i++);
}
void setup ()
{
void (*funcPtr)( void );
funcPtr = &doSomething;
funcPtr(); // calls doSomething();
funcPtr = NULL;
funcPtr(); // undefined behavior
}
के लिए पहला कॉल funcPtr()
वास्तव में एक कॉल होगा doSomething()
। दूसरे की तरह कॉल अपरिभाषित व्यवहार हो सकता है।
उदाहरण के लिए, आप रैम से बाहर भाग सकते हैं। और क्या। किसी भी मामले में, मुझे लगता है कि आपका कार्यक्रम चालू रहेगा, शायद जिस तरह से आप इसे करने का इरादा रखते हैं।
कंप्यूटर सिस्टम में, इस तरह की समस्याओं को आमतौर पर विभिन्न स्तरों पर निपटाया जाता है:
Arduinos के पास केवल संकलक का सीमित संरक्षण है, और शायद कुछ और नहीं। अच्छी खबर यह है कि वे बहु-कार्य नहीं हैं, इसलिए प्रभावित होने वाला एकमात्र कार्यक्रम आपका है। किसी भी मामले में, उन बगों में से कोई भी अनिश्चित व्यवहार को जन्म देगा।
मान्यताओं मैं ऊपर बताई गई समस्याओं के सभी रनटाइम समस्याएं हैं।
यदि किसी प्रोग्राम में रनटाइम त्रुटि होती है, तो क्या होता है?
कार्यक्रम जारी रहेगा और जो होता है वह रनटाइम त्रुटि के दुष्प्रभावों पर निर्भर करेगा। नल फ़ंक्शन पॉइंटर के लिए एक कॉल शायद कार्यक्रम को किसी अज्ञात स्थान पर कूद देगा।
क्या कार्यक्रम का क्रियान्वयन बस रुक जाएगा?
नहीं, यह चलता रहेगा जैसे कि कुछ भी असाधारण नहीं हुआ, शायद ऐसा करने से आप इसे करने का इरादा नहीं रखते थे। यह गलत तरीके से रीसेट या कार्य कर सकता है। यह कुछ इनपुट्स को आउटपुट में बदल सकता है और एक सेंसर या दो को जला सकता है (लेकिन यह अत्यधिक संभावना नहीं है )।
क्या कोई रास्ता है कि मैं Arduino पाने के लिए मुझे बताएं कि त्रुटि क्या है?
मुझे ऐसा नहीं लगता। जैसा कि मैंने पहले कहा था, सुरक्षा तंत्र नहीं हैं। भाषा से कोई रनटाइम समर्थन नहीं है, कोई ओएस नहीं, कोई भी मेमोरी आउट एक्सेस सीमा के लिए कोई हार्डवेयर जांच नहीं करता है (बूटलोडर या तो गिनती नहीं करता है)। आपको बस अपने कार्यक्रम से सावधान रहना होगा और शायद अपना खुद का सुरक्षा जाल सेट करना होगा।
संरक्षण की कमी का कारण शायद यह है कि Arduino नियंत्रकों बहुत सस्ते हैं, बहुत कम स्मृति है, और कुछ भी महत्वपूर्ण नहीं चलना चाहिए (हाँ, AVR द्वारा एक अस्वीकरण प्रतीत होता है कहीं न कहीं आपके लिए MCU का उपयोग आमतौर पर नहीं किया जाता है लाइफ सपोर्ट सिस्टम में Arduino)।
कोई रनटाइम अपवाद नहीं हैं। केवल अपरिभाषित व्यवहार है।
वास्तव में, वहाँ कोई अपवाद नहीं हैं सब पर । यदि आप अमान्य कार्रवाई करने का प्रयास करते हैं, तो यह परिणाम अज्ञात होगा।
आपके द्वारा लागू किए जाने के अलावा कोई रनटाइम चेकिंग नहीं है । आपका प्रोग्राम नंगे-धातु हार्डवेयर पर चल रहा है। यह डेस्कटॉप हर समय रिंग -0 में चलने के बराबर है , क्योंकि एटीमेगा में रिंग्स नहीं हैं ।
एक ऐसा तंत्र है जो अनियमित स्थिति से MCU प्राप्त कर सकता है और यह वॉचडॉग टाइमर है । यदि आप कुछ कोड लागू कर रहे हैं जो बार-बार लूप में चलेगा, जो कि कुछ निश्चित समय से अधिक समय तक नहीं चलेगा, तो आप इस समय को वॉचडॉग अवधि के रूप में सेट कर सकते हैं और टाइमर को सक्षम कर सकते हैं।
फिर, आपको बार-बार लूप में टाइमर को रीसेट करना होगा। यदि आपका कोड कुछ शर्त लूप में जमा हो जाता है जो कभी खत्म नहीं होगा, तो वॉचडॉग शून्य में गिना जाएगा और अंततः एमसीयू को रीसेट करेगा।
इस तरह आप डेटा खो रहे हैं, लेकिन यदि आप AVR WDT को इंटरप्ट मोड में चलाते हैं, तो आप MCU को रीसेट करने से पहले कुछ डेटा स्टोर कर सकते हैं।
तो वॉचडॉग टाइमर कभी-कभी अनजाने अंतहीन छोरों से आपके कोड की रक्षा कर सकता है।
दस्तावेज़ीकरण: AVR132: एन्हांस्ड वॉचडॉग टाइमर का उपयोग करना
आप इस तरह से कुछ के लिए एक हार्डवेयर डिबगर की आवश्यकता होगी। लेकिन आमतौर पर आप इस कार्यक्रम को व्यवहार नहीं करते देखेंगे जैसा कि आप इसकी अपेक्षा करते हैं और समस्या की पहचान करने के लिए कोड के उस भाग को देखना होगा।
ऐसा करने का एक सामान्य / त्वरित / आसान तरीका यह है कि आप चर के मूल्यों को प्रिंट करने के लिए प्रिंट स्टेटमेंट जोड़ सकते हैं या सिर्फ कुछ भी ताकि आप जानते हैं कि प्रोग्राम उस बिंदु पर कोड में एक समस्या के बिना प्राप्त होता है। यह आपको समस्या को और अलग करने में मदद करेगा।
मेरा मानना है कि VisualMicro में कुछ डीबगिंग कार्यक्षमता है।
मुझे लगता है कि AVR CPU के पास कोई त्रुटि का पता लगाने या पुनर्प्राप्ति उपकरण नहीं है। यह बस रुक सकता है, या त्रुटि और परिणामों की अनदेखी करता रह सकता है। जैसे साचलेन ने कहा, आपको अपने प्रोग्राम में कुछ डिबग स्टेटमेंट जोड़ने चाहिए जो किसी ऑपरेशन के बीच में डेटा प्रिंट करते हैं, यह जांचने के लिए कि क्या वह काम कर रहा है। यदि आप एक एमुलेटर और सेट ब्रेकप्वाइंट का उपयोग करते हैं, तो आप आसानी से एक समस्या पा सकते हैं।