2013-07-28 9 views
7

Używam mikroukładu MSP430 z 10K pamięci RAM. Jeśli przekroczę 5k pamięci RAM, to nigdy nie uda się jej wykonać na main(). Kod inicjujący wywołuje __data20_memzero w celu wyczyszczenia używanej pamięci RAM.Moja wbudowana aplikacja nigdy nie kończy init, aby dostać się do main() z powodu watchdoga (IAR/MSP430)

__data20_memzero source

to wyglądać zwiększa to przez pamięć i czyści bajtów do R14 = R12. R14 to 0x34B4. Ale maksymalna wartość R12 to 0x2c86 przed ponownym uruchomieniem i rozpoczyna się od nowa. Ręcznie wyłączyłem watchdoga przez debugger i zaczęło działać poprawnie. Nie widzę tego jako normalnego. Każdy pomysł, jak obejść ten problem?

Odpowiedz

6

Tuż po wysłaniu tego, znalazłem tę notatkę aplikacji

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

Jeśli aplikacja ma wiele (ponad 4k) globalnych zainicjowane danych, a następnie inicjalizacji wewnątrz cstartup nie zostaną zakończone przed upłynął limit czasu watchdog (i urządzenie zostało zresetowane).

i

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

skończyło się dodanie '' #include jak inne opcje były przyczyną pewnych problemów łącznika. Myślę, że wymagane jest tylko zdefiniowanie wartości WDTCTL, WDTPW i WDTHOLD. – reza

2

Jak już stwierdzono, problemem jest to, że korzeń inicjowanie globalny RAM jest po prostu trwa zbyt długo. Chociaż wyłączenie watchdog przy starcie rzeczywiście rozwiązuje problem, jeśli martwisz się, że WD jest wyłączony (nawet tymczasowo), może istnieć alternatywa, aby skrócić ten czas inicjowania.

IAR obsługuje rozszerzenie __no_init. Mówi to kompilatorowi, że nie musi uwzględniać tych zmiennych w procedurze inicjowania. Może to być przydatne np. Stosy RTOS lub bufory komunikacyjne, dla których wartości początkowe nie dodają żadnej wartości.

Jako przykład:

__no_init int8_t timerStack[TIMER_STACK_SIZE]; 
__no_init int8_t displayStack[DISPLAY_STACK_SIZE]; 
Powiązane problemy