2013-07-28 9 views
7

Sto usando un chip MSP430 con 10K di RAM. Se vado oltre l'utilizzo di 5k di RAM, non è mai in grado di farlo su main(). Il codice init chiama __data20_memzero per cancellare lo spazio della RAM utilizzato.La mia applicazione incorporata non termina mai init per arrivare a main() a causa di watchdog (IAR/MSP430)

__data20_memzero source

sembrare che incrementa attraverso la memoria e cancella byte fino R14 = R12. R14 è 0x34B4. Ma il valore massimo di R12 è 0x2c86 prima che si riavvii e ricomincia. Ho spento manualmente il watchdog attraverso il debugger, e ha iniziato a funzionare bene. Non riesco a vedere questo come normale. Qualche idea su come aggirare questo problema?

risposta

6

Subito dopo questo distacco, ho trovato questa applicazione nota

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

Se l'applicazione è non sarà finito molto (più di 4k) di dati inizializzati globali, quindi l'inizializzazione all'interno cstartup prima il watchdog scade (e il dispositivo viene ripristinato).

e

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

ho finito di aggiungere '#include ' come le altre opzioni sono state causando alcuni problemi di linker. Penso che sia solo necessario definire i valori di WDTCTL, WDTPW e WDTHOLD. – reza

2

Come hai trovato, il problema principale è che l'inizializzazione del ram globale sta solo prendendo troppo tempo. Mentre disabilitare il watchdog all'avvio risolve il problema, se sei preoccupato che il WD sia disattivato (anche temporaneamente), potrebbe esistere un'alternativa per accorciare il tempo di avvio.

IAR supporta un'estensione __no_init. Questo dice al compilatore che non ha bisogno di includere quelle variabili nella routine di inizializzazione. Può essere utile per es. Stack di RTOS o buffer di comunicazione per i quali i valori iniziali non aggiungono alcun valore.

Per fare un esempio:

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