2013-07-28 17 views
7

Ich benutze einen MSP430 Chip mit 10K RAM. Wenn ich über 5k RAM-Nutzung gehe, ist es nie in der Lage, es zu main() zu machen. Der Initialisierungscode ruft __data20_memzero auf, um den belegten RAM-Speicherplatz zu löschen.Meine eingebettete Anwendung beendet niemals init, um zu main() wegen Watchdog (IAR/MSP430) zu gelangen

__data20_memzero source

Es aussehen, wie es durch den Speicher erhöht und löscht Bytes bis R14 = R12. R14 ist 0x34B4. Aber der Maximalwert von R12 ist 0x2c86, bevor es neu startet und von vorne beginnt. Ich habe den Watchdog manuell über den Debugger ausgeschaltet und es lief gut. Ich kann das nicht als normal betrachten. Irgendeine Idee, wie Sie dieses Problem umgehen können?

Antwort

6

Genau dies nach der Einlieferung, ich diesen Anwendungshinweis

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

Wenn die Anwendung viel gefunden (über 4k) der globalen initialisierten Daten, dann die Initialisierung innerhalb cstartup nicht vor fertig sein Der Watchdog läuft ab (und das Gerät wird zurückgesetzt).

und

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

Ich landete Zugabe '# include ' wie die anderen Optionen wurden einige Linker Probleme zu verursachen. Ich denke, es ist nur erforderlich, um die Werte von WDTCTL, WDTPW und WDTHOLD zu definieren. – reza

2

Wie Sie gefunden haben, ist das eigentliche Problem, dass die globale RAM Initialisierung zu lange gerade stattfindet. Das Deaktivieren des Watchdogs beim Start löst zwar das Problem, wenn Sie befürchten, dass der WD ausgeschaltet ist (sogar vorübergehend), kann eine Alternative zur Verkürzung dieser Init-Zeit existieren.

IAR unterstützt eine Erweiterung __no_init. Dies sagt dem Compiler, dass er diese Variablen nicht in die Initialisierungsroutine einbeziehen muss. Es kann nützlich sein für z.B. RTOS-Stacks oder Kommunikationspuffer, für die Anfangswerte keinen Wert hinzufügen.

Als Beispiel:

__no_init int8_t timerStack[TIMER_STACK_SIZE]; 
__no_init int8_t displayStack[DISPLAY_STACK_SIZE];