मैं एक Arduino स्केच कैसे डिबग करता हूं?


10

मैंने बहुत हाल ही में Arduino के लिए कोडिंग शुरू की। और कोड में ये कीड़े मुझे मार रहे हैं। जैसे कि Arduino में कोई हार्डवेयर डीबगर नहीं है, serial.print () मेरा एकमात्र सहारा है। Arduino कोड को डीबग करने के लिए आपके द्वारा लागू की जाने वाली विधियाँ / प्रथाएँ क्या हैं?


कृपया खेल के मैदान पर एक नज़र डालें। IDE और डिबगर टूल्स के लिए खेल का मैदान
मेन

जवाबों:


8

मॉड्यूलरिटी आपके दोस्त हैं। कार्यों को कॉल करके अपनी मुख्य लूप को लिखें, जो फ़ंक्शन को कॉल करता है, ..., जब तक कि जिस स्तर पर आपके कार्य सरल होंगे। मुख्य लूप और अगले स्तर के नीचे से शुरू करें, स्टब फ़ंक्शन करें; या तो खाली:

function foo(){
    ;
}

या नकली:

function read_temperature(){
    return(95);
}

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

एक फ़ंक्शन को डीबग करने के लिए जो एक खराब मान लौटाता है, या अपने आवेदन के बाकी हिस्सों से किसी भी प्रभाव के बिना एक बनाने के लिए, आप मचान का निर्माण कर सकते हैं - एक साधारण स्केच जो फ़ंक्शन को केवल कुछ उदाहरण मानों को खिलाता है, और फ़ंक्शन के भीतर, पैरामीटर मान प्रिंट करें और कुछ मध्यवर्ती मान, जब तक आप कुछ अंतर्दृष्टि प्राप्त नहीं करते हैं कि फ़ंक्शन का कौन सा भाग विफल हो रहा है। मैंने फ़ेकिंग-फ़ंक्शंस भी किए हैं जो मुझे वापस लौटने के लिए टर्मिनल पर प्रॉम्प्ट करता है। (जाहिर है कि यह तकनीक तभी काम कर सकती है जब प्रणाली हम मनुष्यों की अपेक्षाकृत हिमानी गति को सहन कर सकती है! डांट का दूसरा उपयोग।)

स्टबिंग विशेष रूप से अच्छी तरह से कार्य करता है जो कि हार्डवेयर के लिए इंटरफ़ेस के लिए खड़ा है, जिससे आप डेटा-शीट, टाइमिंग मुद्दों और अन्य minutiae (जैसे, पुर्ज़े नहीं हो रहे हैं!) में गोता लगाने से पहले एप्लिकेशन को लाने की अनुमति देते हैं जो अन्यथा स्टाल हो सकता है। आपकी प्रगति।

समय के मुद्दों की बात करें, तो अपने प्रोग्राम में किसी विशेष बिंदु पर आउटपुट पिन को टॉगल करना, जैसे कि ISR से प्रवेश करना और बाहर निकलना, आपको Arduino पिन पर एक चौकोर तरंग देता है जिसकी आवृत्ति या कर्तव्य चक्र आपको आंतरिक समय में कुछ जानकारी दे सकता है। अपने कार्यक्रम के प्रत्यक्ष पोर्ट- I / O फॉर्म, जैसे,

PORTC ^= 0x01;

, कॉलिंग से कम समय को विकृत करेगा digitalWrite()। उपयोगी है यदि आपके पास 'गुंजाइश काम है, या आवृत्ति और / या कर्तव्य-चक्र को मापने की क्षमता के साथ DMM में से एक है।

इसी प्रकार, आप समय को बहुत अधिक परेशान किए बिना या धारा I / O फ़ंक्शन के साथ कोड को ब्लोट किए बिना प्रोग्राम के अंदर से अपने मीटर के लिए संख्यात्मक मान को आउटपुट करने के लिए एक एनालॉग आउटपुट पिन का उपयोग कर सकते हैं। यहाँ भी प्रत्यक्ष I / O रूपों का उपयोग करें।


6

मैं Serial.print () का उपयोग करता हूं और मैं LED को फ्लैश बनाता हूं।

यह सब आप कर सकते हैं बहुत ज्यादा है।

इसके अलावा, मुझे यकीन है कि कोड पढ़ने योग्य और समझने में आसान है। चीजों को सरल चरणों में तोड़ दें और प्रत्येक चरण के लिए कार्य बनाएं, ताकि आप घटनाओं के सटीक अनुक्रम को देख सकें।


5

3 अन्य तकनीक:

  • प्रत्येक चरण में धीरे-धीरे परीक्षण करके एक कार्यक्रम की कार्यक्षमता का निर्माण करें, इस तरह से आप एक समय में बग के केवल एक छोटे से सेट का सामना करते हैं।

  • एक कमांड दुभाषिया के आसपास कार्यक्रम का निर्माण करें ताकि आप यहां के रूप में एक समय में अनुभागों के साथ काम कर सकें ।

  • महत्वपूर्ण समय पर पल्स करें और एक गुंजाइश का उपयोग करें।


3

दृश्य माइक्रो दृश्य स्टूडियो के लिए प्लगइन प्रदान करता है Arduino डिबग । स्रोत कोड ट्रेस शामिल है और ब्रेक भी अभिव्यक्ति और चर को "देखा" और / या संशोधित करने की अनुमति देता है।

यहाँ छवि विवरण दर्ज करें


1
ध्यान दें कि यह स्वचालित रूप से आपके कोड में डाले गए सीरियल प्रिंट के माध्यम से किया जाता है।
प्रति 1234

यह सीरियल या वाईफाई प्रिंट को छोड़कर सही है और कोड को वास्तविक कोड नहीं कोड की एक अस्थायी प्रतिलिपि में डाला जाता है! यह सभी Visualmicro.com डॉक्स में स्पष्ट रूप से समझाया गया है और उन कुछ के लिए जिनके पास हार्डवेयर डीबगर्स हैं (आमतौर पर Uno आदि के लिए नहीं) वे भी समर्थित हैं। प्रत्येक विधि के अपने फायदे और डिस-फायदे हैं।
विजुअल माइक्रो

Arduino के लिए डीबगर से : "इसने कोड के माध्यम से कदम रखने का समर्थन नहीं किया और यह डिबगर के साथ संवाद करने के लिए निर्माण से पहले आपके प्रोग्राम में डाले गए छिपे हुए कोड पर आधारित था।"
पीटर मोर्टेंसन

ये सही है। यह सीरियल प्रिंट को जोड़ने के लिए उपयोगकर्ताओं की आवश्यकता को टालता है, नामित संस्करणों को अपडेट करने की अनुमति देता है जबकि सीपीयू चलता है, ग्राफ़ और डिजिटल पिन आदि दिखाता है। यह एक हार्डवेयर डिबगर से अलग है, लेकिन तेज़ और आसान और अन्य लाभ हैं। यह सभी अच्छी तरह से visualmicro.com पर प्रलेखित है, इसलिए कृपया इसे पढ़ें। यदि आप बोर्ड gdb का समर्थन करते हैं या आप atmel स्टूडियो का उपयोग करते हैं तो निश्चित रूप से अन्य डिबग विकल्प हैं। यह सब आपकी विशेषज्ञता और आपके पास किस हार्डवेयर पर निर्भर करता है। यदि आपके पास वास्तविक Arduino है, तो Atmel स्टूडियो में आप armelino को atmel डिबग या सिम के साथ जोड़ सकते हैं।
विजुअल माइक्रो

2

एआरएम या अन्य प्लेटफार्मों (एवीआर, पीआईसी विद सभ्य उपकरण) जैसे लक्जरी उपकरणों से जा रहे हैं, मैं मानता हूं कि Arduino डिबगिंग सुविधाएं बहुत सीमित हैं। लेकिन यह कम प्रविष्टि वाला एक स्टार्टर उपकरण है।

Serial.print () आपका दोस्त है। मेरी विशेष परियोजना (कॉलेज) के लिए, मुझे कोई एल ई डी संलग्न नहीं था, इसलिए यह सीरियल (प्रिंट) है। अगर मैं यह जांचना चाहता हूं कि क्या कथन के माध्यम से कोड ठीक से चलता है, तो मैं आमतौर पर Serial.print ("ए") रखता हूं; , तब B, C, आदि पर जा रहा हूं या खंड के माध्यम से कुछ मैं डिबगिंग कर रहा हूं। मैं उन डिबग पत्रों की तुलना करता हूं जो मुझे उम्मीद है कि इसे करना चाहिए।

इसके अलावा, कोई ब्रेकप्वाइंट या कोड स्टेपिंग नहीं है। Arduino एक AVR atmega चिप, बूटलोडर + डेवलपमेंट एनवायरनमेंट और सॉफ्टवेयर लाइब्रेरी के एक टन के साथ बोर्ड से ज्यादा कुछ नहीं है। दुर्भाग्य से, बूटलोडर के साथ काम करना डिबगिंग क्षमताओं को सीमित करता है।


0

serial.printअधिक नियंत्रित का उपयोग करने के लिए आप डिबग को चालू और बंद करने के लिए एक वैश्विक बूलियन चर को परिभाषित कर सकते हैं। serial.printवसीयत की किसी भी पंक्ति को एक ifबयान के भीतर लपेटा जाएगा जिसे केवल तभी निष्पादित किया जाएगा जब डिबग ध्वज चालू हो। इस तरह आप कोड में डिबग लाइनों को तब भी छोड़ सकते हैं जब आप काम कर रहे हों, लेकिन डिबग फ्लैग को बाद में बंद करना सुनिश्चित करें।


0

सीधे serial.print से बेहतर है, मैक्रोज़ का उपयोग करें। उदाहरण:

#ifdef TRACE1
#define trace1(s) serial.print(s)
#define traceln1(s) serial.println(s)
#else
#define trace1(s)
#define traceln1(s)
#endif

इसे इस तरह उपयोग करें:

function doIt(param1, param2) {
    trace1("->doIt("); trace1("param1: "); trace1(param1); trace1(" param2: "); trace1(param2); traceln1(")");

    ...

    traceln1("<-doIt");
}

आपके पास (#ifdef TRACE2 ...)अधिक विवरण के साथ अलग-अलग ट्रेस स्तर हो सकते हैं ।

और आप "एफ" मैक्रो का उपयोग कर सकते हैं (trace1(F("param1"));),। "एफ" मैक्रो रोकता है कि स्ट्रिंग SRAM की बेहद सीमित मात्रा का उपयोग करेगी।


0

पलक एलईडी, सीरियल पोर्ट पर चीजों को प्रिंट करें, और एक बार में कोड के छोटे वर्गों को लिखें और डिबग करें, कभी-कभी केवल कुछ लाइनें।

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

एक और इसी तरह का एक निर्देश सेट सिम्युलेटर का उपयोग करने के लिए हो सकता है यदि आपके पास एक तक पहुंच है (यदि नहीं, तो यह एक बहुत ही शैक्षिक और पुरस्कृत परियोजना है, जब आप उनमें से कुछ कर चुके हैं तो आप एक सप्ताहांत या दो में बाहर धमाका कर सकते हैं)। और भी बेहतर अगर किसी प्रोसेसर की एक Verilog या VHDL क्लोन (है OpenCores आप GHDL, कोशिश कर सकते हैं उदाहरण के लिए) Verilator , या इकारस Verilog । यह उन परिधीयों को शामिल करने के लिए पर्याप्त हो सकता है जिन्हें आप में रुचि रखते हैं, और आप संकेत स्तर की दृश्यता प्राप्त कर सकते हैं कि अंदर क्या चल रहा है।

दी यह एक आदर्श क्लोन नहीं है, लेकिन यह काफी अच्छा हो सकता है। वेरिलेटर वास्तव में C / C ++ में पेरिफेरल बनाना वास्तव में आसान बनाता है ताकि आप अपने AVR डिवाइस को अप करने के लिए जो कुछ भी कर सकते हैं उसे अनुकरण कर सकें।

UART का आउटपुट और ब्लिंकिंग LEDs और / या GPIO लाइन्स को ब्लिंक करना और एक आस्टसीलस्कप या वाल्टमीटर का उपयोग करना। पागल नहीं होने की कुंजी कोड के छोटे वर्गों को लिखना और डिबग करना है। मैं एक बार में 10 लाइनें लिखना और 1000 लाइनों की तुलना में 100 परीक्षण करना बेहतर हूं और उन सभी को एक शॉट में डीबग करने का प्रयास करता हूं। खासकर जब आपको पता चलता है कि ज्यादातर डेटाशीट और प्रोग्रामर हार्डवेयर के लिए रेफरेंस मैनुअल हमेशा सही नहीं होते हैं। कुछ हैकिंग की हमेशा आवश्यकता होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.