मैं STM32L476 (फ्रीआरटीओएस के बिना) के साथ एक एप्लिकेशन विकसित कर रहा हूं। मैं SW4STM32 और STM32CubeMx का उपयोग कर रहा हूं। मैं अपने आवेदन में Fatfs के साथ SDMMC का उपयोग कर रहा हूं। वर्तमान में जब मैं स्मृति मुक्त करता हूं तो मुझे एक कठिन दोष दिखाई देता है।

लिंकर फ़ाइल के अनुसार ये मेरे ढेर और ढेर विवरण हैं

/* Highest address of the user mode stack */
_estack = 0x20018000;    /* end of RAM */
/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x7E20;      /* required amount of heap  */
_Min_Stack_Size = 0x1FA0; /* required amount of stack */

0x20003248 वह पता है जिस पर दुर्घटना होती है (वह पता है जिसे मैं मुक्त कर रहा हूं)

मैंने इस लिंक Cortex-M3 हार्ड फॉल्ट - कारण खोजें

हार्डफॉल्ट पर मुझे यही मिलता है:

SCB->HFSR = 0x40000000
Forced Hard Fault
SCB->CFSR = 0x00008200

लेकिन मैं कुछ भी निष्कर्ष नहीं निकाल सका

1
Nithin Kurian 27 जून 2018, 10:53

1 उत्तर

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

इस तरह के हार्डफॉल्ट - free या यहां तक ​​​​कि malloc में - आमतौर पर आपकी मेमोरी के किसी तरह से दूषित होने की समस्या का संकेत देते हैं। सबसे आम कारण या तो एक ही मेमोरी एड्रेस पर डबल free है या मेमोरी में डेटा को ओवरराइट करना, उदा। किसी प्रकार के बफर के अंत से पहले लिखना।

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

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

3
Jacek Ślimok 27 जून 2018, 12:47