2012-01-10 15 views
11

मैं एसटीएम 32 एफ 107 चिप के साथ सी में कुछ विकास कर रहा हूं और, किसी बिंदु पर, डिवाइस को रीसेट करना शुरू हुआ जब मैं एक विशिष्ट फ़ंक्शन को कॉल करता हूं। मेरे पास डीबगर नहीं है और मेरा डीबगिंग एक सीरियल पोर्ट पर सिर्फ सादा पाठ है।मैं एसटीएम 32 डिवाइस में अप्रत्याशित रीसेट कैसे डिबग करूं?

मैंने कुछ अन्य माइक्रोकंट्रोलर का उपयोग किया है जिसमें मैं रीसेट के कारण को देखने के लिए एक रजिस्टर तक पहुंचने में सक्षम था, लेकिन मुझे इस डिवाइस के बराबर नहीं लग रहा है। मुझे कॉर्टेक्स-एम 3 के हार्डवेयर अपवादों के बारे में पता है, लेकिन मुझे नहीं पता कि उनमें से एक ट्रिगर किया जा रहा है क्योंकि जब मैं उन हैंडलरों के अंदर हूं तो शायद मुझे उपयोगकर्ता पर टेक्स्ट भेजने की प्रतीत नहीं होती है (शायद क्योंकि मेरा TX कार्य बाधाओं का उपयोग करें?)।

तो, मैंने इस डिवाइस में लोगों से अधिक अनुभव के साथ लोगों से पूछने का फैसला किया: आमतौर पर इन तरह की स्थितियों को डीबग करने के लिए क्या किया जाता है?

संपादित

डेवलपर्स की WWDG प्रहरी ही सक्रिय है और यह हार्डवेयर reseting गया था इससे पहले कि मैं गलती संचालकों से मेरी जानकारी मिल सकता है। गलत जगह पर इशारा करते हुए एक सूचक द्वारा एक समारोह को बुलाए जाने के कारण यह हार्ड फाल्ट था। हालांकि, मैं इस सवाल को आशा में रखूंगा कि कोई भी बचाए गए रजिस्टरों से सी कोड को इंगित करने के लिए अधिक जानकारी (या इसके बारे में सामग्री) देगा, कहें, हार्ड फाल्ट (@ ड्वाल्च विचार)।

उत्तर

11

कॉर्टेक्स एम 3 में उत्कृष्ट गलती हैंडलिंग सुविधाएं हैं जो आपके जीवन को आसान बनाती हैं। एक गलती मारने पर, यह स्वचालित रूप से पीसी और एलआर जैसे कई रजिस्टरों को ढेर करता है, और गलती स्थिति रजिस्ट्रार आपको बस गलती के पते जैसी चीजें बताएंगे।

आपको एक अच्छा गलती हैंडलर लागू करना चाहिए (उदाहरण के लिए, हार्ड गलती हैंडलर यहां: http://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/) स्टैक्ड रजिस्टरों को मुद्रित करने और गलती स्थिति रजिस्टरों को डीबग करने के लिए।

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

1

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

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

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

1

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

आगे बढ़ने के तरीके पर निर्भर करता है कि आप वास्तव में क्या देख रहे हैं, आपको अधिक स्पष्ट या विशिष्ट होना चाहिए, या शायद आप इसे समझने में सहायता चाहते हैं।

आम तौर पर मैं अप्रयुक्त वैक्टर को कोड की एक साधारण लटकती रेखा पर मानचित्र करता हूं जो स्वयं शाखाएं करता है। बाद में मैं उनमें से कुछ को वास्तविक कोड में रीमेप कर सकता हूं।

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

वहां से आपको पता लगाना होगा कि आप उस अपवाद को क्यों मार रहे हैं, उदाहरण के लिए यह एक असाइन किए गए पहुंच की तरह कुछ हो सकता है। यह हो सकता है कि आप हैंडलर को पूरी तरह से स्थापित करने से पहले किसी डिवाइस को इनलाइन करने का प्रयास करते समय एक बाधा उत्पन्न कर चुके हैं, जो जानता है।

अपने प्रश्न को अधिक उत्तरों या जानकारी के साथ संपादित करें जब आप इसके माध्यम से काम करते हैं।

0

"सही" चीज करने के लिए दुर्भाग्य से एसटीएम 32 के साथ व्यावहारिक नहीं है। यह एक बड़े अपवाद हैंडलर को रखना होगा जिसमें स्रोत कोड का ज्ञान हो, और ढेर को खोलने और आपको पूर्ण कॉल स्टैक और लाइन नंबर दे सकता है जो गलती का कारण बनता है। इसके लिए आपके आवेदन से सभी डीबग जानकारी एसटीएम 32 की फ्लैश मेमोरी में जोड़ने की आवश्यकता होगी, और यह व्यावहारिक नहीं है।

कभी-कभी आपको कॉल स्टैक देने के लिए अपने आईडीई को धोखा देने के तरीके हैं। मैं विवरण दूंगा लेकिन मैं उन्हें लिखना भूल गया, इसलिए मैं भूल गया हूं। मुझे लगता है कि इसे एक छाया रजिस्टर से दूसरे में स्टैक पॉइंटर को मैन्युअल रूप से बदलना होगा।

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

3

डीबगिंग के लिए इंटरप्ट हैंडलरों के बारे में क्या बताया गया है, इसके अलावा कुछ एसटी माइक्रोस्कोस में एक रीसेट सोर्स रजिस्टर भी है जिसे आप पावर-अप (जो रीसेट के बाद है) पर पढ़ सकते हैं। कॉर्टेक्स एम परिवार (एम 0/एम 3/एम 4) के लिए रजिस्टर आरसीसी_Cएसआर है। http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf

दुर्भाग्यवश आप यह जानने में सक्षम नहीं होंगे कि हार्डफॉल्ट जैसे विनिर्देश, लेकिन यह आपको बताएगा कि वॉचडॉग (विंडो या स्वतंत्र) ट्राइप हो गया था या नहीं।

संबंधित मुद्दे