После долгих разборок удалось локализовать проблему, и вот что получилось:
Код
void main() {
WDTCTL = WDTPW + WDTHOLD;
TimerB_Init();
__enable_interrupt();
OS::Run();
}
WDTCTL = WDTPW + WDTHOLD;
TimerB_Init();
__enable_interrupt();
OS::Run();
}
Этот код работает, ОС запускается, задачи переключаются.
А вот этот:
Код
void main() {
WDTCTL = WDTPW + WDTHOLD;
TimerB_Init();
for(volatile uint16_t i = 0; i < 5000; i++);
__enable_interrupt();
OS::Run();
}
WDTCTL = WDTPW + WDTHOLD;
TimerB_Init();
for(volatile uint16_t i = 0; i < 5000; i++);
__enable_interrupt();
OS::Run();
}
Приводит к бесконечным рестартам устройства. Причем, поведение зависит от величины задержки. Если написать:
Код
for(volatile uint16_t i = 0; i < 1000; i++);
ОС запускается..
Компилятор - IAR.
Видимо, я не понимаю какие-то фундаментальные вещи, но своим умом понять не могу

К сообщению прикладываю тестовый проект.