[an error occurred while processing this directive]
|
>>Мне не подходит, чтобы задача "отстреливала" целиком.
:) Поясни
+++
void my_task_1(void) // задачa 1
{ ... // инициализируем задачу
while ( 1!=0) // далее - бесконечный цикл
{
... // делаем что-то полезное
delay(10); // возвращаем управление ядру на 10 тиков (suspend task)
... // опять делаем что-то полезное
delay(0); // возвращаем управление ядру на 0 тиков (ready to continue immediately)
... // опять делаем что-то полезное
// и т.д.
}
}
>>Ставить ради такого сервиса вытесняющую ОСРВ я тоже не вижу смысла, т.к.
>>ей потребуется больше времени на переключение контекста. Не говоря уж о
>>размерах, сложности, и пр.
Что за _сервис_ тебе нужен?
+++
void delay(int N); // suspends current task for N system ticks,
// returns control to RTOS kernel
Таймер? Дык он привязан во всех RTOS к системному тику, следовательно точной(точнее тик+1) привязки ты получить не сможешь. Это организуется за счет дополнительных прерываний...
+++
I need just one ISR to service timer interrupt. That ISR will set a "tick flag", that's all. The rest will be done in RTOS kernel. Kernel clears "tick flag", counts delay time for each task and invokes active tasks. Trivial.
>>В данном случае мне надо закрутить 4 задачи, из них две - связные,
>>где есть критические участки в несколько мс.
Требуется более полное описание что ты под этим подразумеваешь...
Если необходимо переключиться из одной задачи в другую, то это уже не round-robin...
+++
Blin! это round-robin!!!
example:
task_1
task_2
skip task_3 (it still in sleep mode)
skip task_4
continue task_1
continue task_2
... etc, round-robin
Книгу по uCOS листал?
+++
Briefly. Long time ago.
E-mail: info@telesys.ru