2013-07-28 4 views
7

के कारण मुख्य() प्राप्त करने के लिए कभी भी अंत में खत्म नहीं होता है, मैं 10 के रैम के साथ एक एमएसपी 430 चिप का उपयोग कर रहा हूं। अगर मैं 5k रैम उपयोग से ऊपर जाता हूं, तो यह इसे मुख्य() में बनाने में सक्षम नहीं होता है। उपयोग की गई रैम स्पेस को साफ़ करने के लिए इनिट कोड __data20_memzero पर कॉल करता है।मेरा एम्बेडेड एप्लिकेशन वॉचडॉग (आईएआर/एमएसपी 430)

__data20_memzero source

यह देखने के लिए कि यह स्मृति के माध्यम से वृद्धि कर देता है और R14 = R12 तक बाइट्स साफ करता है। आर 14 0x34B4 है। लेकिन R12 का अधिकतम मान 0x2c86 है जो इसे रीबूट करने से पहले और फिर से शुरू होता है। मैंने मैन्युअल रूप से डीबगर के माध्यम से वॉचडॉग बंद कर दिया, और यह ठीक चल रहा था। मैं इसे सामान्य होने के रूप में नहीं देख सकता। इस समस्या को हल करने के बारे में कोई विचार है?

उत्तर

6

बस इस पोस्ट करने के बाद, मैं इस आवेदन टिप्पणी

http://supp.iar.com/Support/?note=37778&from=search+result

आवेदन ज्यादा तो वैश्विक प्रारंभ डेटा की (4k से अधिक), cstartup भीतर सक्रियण से पहले खत्म नहीं होगा गया है, तो हो पाया वॉचडॉग टाइम्स आउट (और डिवाइस रीसेट हो गया है)।

और

The solution 

The Watchdog timer must be turned off before the initialization phase. This should preferably be done in __low_level_init. 

The steps (for F1610, F1611 or F1612) 
Copy of the file "low_level_init.c" (from ...\430\src\lib\) to your project directory. 
Add the copied "low_level_init.c" file to your project. 
Edit your copy of the "low_level_init.c" file 
In the file you need to add, either... 

#include <msp430x16x.h> 

...or add... 

#include <io430x16x.h> 

You should add, in the __low_level_init() function. 

WDTCTL = WDTPW + WDTHOLD; 
+0

मैं '# शामिल ' अन्य विकल्प कुछ लिंकर समस्याओं पैदा कर रहे थे के रूप में जोड़ने समाप्त हो गया। मुझे लगता है कि केवल WDTCTL, WDTPW, और WDTHOLD के मानों को परिभाषित करने की आवश्यकता है। – reza

2

यदि आप पाते हैं के रूप में, जड़ समस्या यह है कि आरंभ वैश्विक राम बस में अधिक समय लगने है। स्टार्टअप पर वॉचडॉग को अक्षम करते समय वास्तव में समस्या हल होती है, अगर आप डब्लूडीडी बंद होने के बारे में चिंतित हैं (यहां तक ​​कि अस्थायी रूप से), तो उस समय को कम करने के लिए एक विकल्प मौजूद हो सकता है।

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

एक उदाहरण के रूप:

__no_init int8_t timerStack[TIMER_STACK_SIZE]; 
__no_init int8_t displayStack[DISPLAY_STACK_SIZE]; 
संबंधित मुद्दे