Мое встроенное приложение никогда не заканчивает init, чтобы добраться до main () из-за watchdog (IAR/MSP430)
Я использую чип MSP430 с 10K ОЗУ. Если я пойду выше 5k использования ОЗУ, он никогда не сможет сделать это в main(). Код init вызывается __data20_memzero
чтобы очистить используемое пространство ОЗУ.
похоже, что он увеличивается через память и очищает байты до 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];