Выявил неприятное поведение при переключении задач в ОС, порт под msp430X.
Использую схему переключения задач
Код
#define scmRTOS_CONTEXT_SWITCH_SCHEME 1
В обработчике прерывания используется обвертка TISRW или TISRW_SS.
При выходе из обработчика прерывания вызывается планировщик Kernel.SchedISR();
Код
INLINE void ISR_Exit()
{
DisableInterrupts();
if(--Kernel.ISR_NestCount) return;
Kernel.SchedISR();
}
Установиться флаг прерывания, и должно сработать прерывание по переключению задач.
Но, пока мы находились в предыдущем обработчике, приходит время сработать системному таймеру (его обработчику).
Выходит, по выходу из прерывания мы попадаем в более приоритетное прерывание от таймера, а в нем разрешаются прерывания
Код
#if scmRTOS_SYSTIMER_NEST_INTS_ENABLE == 1
ENABLE_NESTED_INTERRUPTS();
#endif
и вот уже здесь вызовется обработчик прерывания по переключению задачи.
Ни к чему хорошему это не приводит, так как переменная ядра Kernel.ISR_NestCount будет инкрементирована и после переключения задач уже запорченой.
Как результат из задачи, куда мы переключились мы уже никогда не выйдем - зависнем.
Я правильно понял, что при scmRTOS_CONTEXT_SWITCH_SCHEME = 1 в других прерываниях никогда нельзя разрешать вложенных прерываний? Не только в системном таймере, а в любом прерывании, особенно если в нем используется TISRW или TISRW_SS?