Мое встроенное приложение никогда не заканчивает init, чтобы добраться до main () из-за watchdog (IAR/MSP430)

Я использую чип MSP430 с 10K ОЗУ. Если я пойду выше 5k использования ОЗУ, он никогда не сможет сделать это в main(). Код init вызывается __data20_memzero чтобы очистить используемое пространство ОЗУ.

__data20_memzero source

похоже, что он увеличивается через память и очищает байты до R14=R12. С14-это 0x34B4. Но максимальное значение R12-0x2c86 перед перезагрузкой и повторным запуском. Я вручную отключил сторожевого пса через отладчик, и он начал работать нормально. Я не могу считай это нормальным. Любые идеи, как обойти эту проблему?

2 ответов


сразу после публикации этого, я нашел это приложение Примечание

http://supp.iar.com/Support/?note=37778&from=search+результат

Если приложение имеет много (более 4k) глобальных инициализированных данных, то инициализация в cstartup не будет завершена до watchdog тайм-аут (и устройство сбрасывается).

и

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 ...0\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;

Как вы обнаружили, основная проблема заключается в том, что инициализация глобальной ОЗУ занимает слишком много времени. Хотя отключение сторожевого пса при запуске действительно решает проблему, если вы беспокоитесь о том, что WD выключен (даже временно), может существовать Альтернатива для сокращения этого времени инициализации.

IAR поддерживает расширение __no_init. Это говорит компилятору, что ему не нужно включать эти переменные в процедуру инициализации. Это может быть полезно, например, для стеков RTOS или буферы связи, для которых начальные значения не добавляют никакого значения.

пример:

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