реклама на сайте
подробности

 
 
> Схема перключения задач "scmRTOS_CONTEXT_SWITCH_SCHEME == 1", Порт под msp430X
Sergey Bold
сообщение Mar 5 2010, 12:26
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 20-05-09
Из: Харьков
Пользователь №: 49 299



Выявил неприятное поведение при переключении задач в ОС, порт под 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?
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 05:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01312 секунд с 7
ELECTRONIX ©2004-2016