2010-09-21 9 views
5

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

हार्ड गलती के बिंदु पर प्रोग्राम काउंटर का मूल्य कैसे निर्धारित करूं? जाहिर है, पीसी अब हार्डफॉल्ट बाधा के भीतर अपने स्थान पर सेट है।

मुझे कहां देखना चाहिए? यह सामान्य मोड रजिस्टर बैंक के लिए एक पता है?

धन्यवाद!

+0

मैं भी जानना चाहता हूं, लेकिन आपको chiphacker.com पर बेहतर उत्तर मिल सकता है। – leppie

उत्तर

6

कॉर्टेक्स- एम 3 अपवाद "क्लासिक" एआरएम से निपटने का काफी अलग मॉडल का उपयोग करता है, जैसे यह नहीं है "मोड गर्भपात" अन्य पोस्ट में उल्लेख किया। मैं तुम्हें सुझाव है this app note पढ़ने के लिए । उदाहरण के लिए, हार्ड दोष के लिए:

SCB- का मूल्य> BFAR स्मृति पता है कि एक बस दोष का कारण बना और अगर SCB-> CFSR रजिस्टर में थोड़ा BFARVALID सेट किया गया है मान्य है इंगित करता है। एससीबी-> एमएमएफएआर का मान स्मृति पता इंगित करता है जो मेमोरी प्रबंधन फॉल्ट का कारण बनता है और एससीबी-> सीएफएसआर रजिस्टर में बिट MMFARVALID सेट होने पर मान्य है।

अपवाद के समय पीसी मूल्य निर्धारित करने के लिए आपको ढेर की जांच करने की आवश्यकता है; हैंडलर को निष्पादित करने से पहले प्रोसेसर R0-R3, R12, पीसी और एलआर को धक्का देता है। इस्तेमाल किया गया ढेर या तो मुख्य हो सकता है (यदि एलआर का बिट 2 0 है) या प्रक्रिया (अन्यथा)। विवरण के लिए ऐप नोट के पेज 13 देखें।

+0

धन्यवाद इगोर, मैं पीसी को ढेर से कैसे लाऊं? – JeffV

+1

आपको पीएसपी या एमएसपी लाने की आवश्यकता है और इसे 0x18 ऑफसेट पर एक शब्द प्राप्त करें। यहां एक उदाहरण कार्यान्वयन देखें: http://embdev.net/topic/170640#1636052 –

+0

अभी भी इसे समझने की कोशिश कर रहा है। क्या यह एमएसपी के ऊपर 24 बाइट ऑफसेट है ?: uint32_t * पीसी = (uint32_t *) ((char *) _ get_MSP() + 24); – JeffV

3

आपको अपवादों के अनुभाग में ARM Architecture Reference Manual पर देखना चाहिए। इसे पाने के लिए आपको पंजीकरण करने की आवश्यकता है।

आमतौर पर लिंक रजिस्टर एलआर (आर 14) में एक प्रासंगिक पता लगाया जाएगा, लेकिन सटीक अर्थ अपवाद के अनुसार भिन्न होता है, और अलग-अलग ऑफ़सेट होते हैं।

W.r.t. उपयोगकर्ता/सिस्टम मोड रजिस्टर बैंक तक पहुंच, मुझे लगता है कि आपको इसे एक्सेस करने के लिए मोड को स्विच करने की आवश्यकता है।

+0

आह, अच्छा! डिबगिंग करते समय बस इसे चेक करें (वर्तमान में कोई कठोर गलती कैसे करें, कोई संकेत नहीं है; पी) और यह वास्तव में कॉलर का पता दिखाता है। आपका बहुत बहुत धन्यवाद! – leppie

+0

ठीक है, मुझे लगता है कि यह कॉलर नहीं है, लेकिन वापसी का पता है। – leppie

+1

मैंने हार्ड गलती उत्पन्न की: * ((char *) 0x00) = 5; – JeffV

0

मुझे इन मुद्दों के लिए 'लूप' देरी के लिए एक आम कारण मिला। जब आप -O3 का उपयोग करते हैं तो वे आसानी से ऑप्टिमाइज़ हो जाते हैं यदि आप अस्थिर चर का जिक्र नहीं कर रहे हैं। व्यक्तिगत रूप से, मैं SysTick दृष्टिकोण पसंद करते हैं।

+0

धन्यवाद @leppie, पूरी तरह से सहमत हैं।यहां लूप के लिए कोई देरी नहीं है, मैं भी अपनी गिनती के लिए SysTick का उपयोग कर रहा हूँ। ब्लॉकिंग से बचने के लिए, हर चीज एक राज्य मशीन में भी है। मुझे लगता है कि अगर मैं इसे पर्याप्त समय देता हूं तो समस्या स्वयं डीबग मोड में उपस्थित होगी। – JeffV

1

जब कोई अपवाद होता है, प्रोसेसर राज्य वर्तमान स्थिति से बदलकर अवस्था में बदल जाता है। निरस्त राज्य में प्रोसेसर एसपी और एलआर (sp_abt और sp_lr क्रमशः रजिस्ट्रारों के नए सेट का उपयोग करने के लिए स्थानांतरित हो जाता है। डेटा निरस्त करने के लिए, अपमानजनक निर्देश lr_abt + 8 में lr_abt + 4 के बारे में प्रीफेक्ट के लिए पाया जा सकता है (अनुसार ARMv7 architecure संदर्भ मैनुअल)

+0

बहुत बढ़िया, धन्यवाद! – JeffV

+0

ने मेरे भाग पर बहुत खराब गलती को sp_abt में बदल दिया - अब – doron

+2

तय किया गया है यह क्लासिक एआरएम के लिए मान्य है लेकिन कॉर्टेक्स-एम 3 –

1

मेरे पास इस विषय पर एक FAQ है। एफएक्यू से जुड़े पेज में fault handler code शामिल है जो आपके लिए स्टैक से प्रोग्राम काउंटर प्राप्त करेगा।

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