Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: timeslicing в uCOS то есть внешнее управление не реалтаймовыми задачами
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > uC/OS-II
yes
есть система, в которой реалтаймовая часть (прерывания, флаги/семафоры и т.п.) взаимодействует с некими вычислительными задачами, которые являются вычислениями и время завершения цикла неопределено и большое (ну и код соответственно большой/ветвистый и вставить в него ожидание каких-то событий типа OSSemPend трудно)

таких задач несколько, ну и также хочется, чтобы статистическая задача работала

кажется, что это можно сделать так :
в uCOS эти вычислительные задачи получают приоритеты ниже самой низкоприоритетной реал-таймовой задачи,
в задачу с высоким (наверно самым высоким) uCOS приоритетом вставляется "шедулер"
высокоприоритетная задача (uCOS priopity=1) срабатывает по периодическому таймеру,
в этой задаче суспендятся эти три вычислительные задачи и инкрементируется счетчик
каждое второе срабатывание запускается более приоритетная задача,
каждое четвертое со средним приоритетом
ну и каждое 8 - с низким
при этом приоритеты означают не приоритеты uCOS, а количество времени, которое процессор тратит на задачу
(возможно равномерное распределение - каждый тик одна задачка суспендится, одна запускается, но это не нужно)
остальное время выделено на статистическую+IDLE

ничего я тут не перемудрил?
будет это работать (предполагается использовать OSTaskSuspend(), OSTaskResume())?

может такая фигня есть уже в uCOS? (давно не имел дело с uCOS)
Sergey'F
В uC/OS-II тайм-слайсинга и карусели нет. Предложенное работать должно.
yes
Цитата(Sergey'F @ Feb 15 2010, 16:24) *
В uC/OS-II тайм-слайсинга и карусели нет. Предложенное работать должно.


да, работает, только с таймерами какая-то фигня (то ли я доки не понял, то ли еще что-то)
тикать надо вручную посредством OSTmrSignal(), из этого OSTmrSignal семафор и специальная задача (Task) его ждет
в Альтеровской реализации при разрешении таймеров занимается задача с максимальным приоритетом
и т.п.

мне проще сделать таймер в железе (Альтера, NIOS) и к нему этот шедулер прицепить, вроде и код прямее, и "оверхед" меньше,
ну или вешать на hook системного таймера
Sergey'F
Цитата(yes @ Feb 15 2010, 20:11) *
мне проще сделать таймер в железе (Альтера, NIOS) и к нему этот шедулер прицепить, вроде и код прямее, и "оверхед" меньше,
ну или вешать на hook системного таймера

Так ведь предполагается, что OSTmrSignal() вызывается из OSTimeTickHook(). Пример есть в описании OSTmrSignal() в Reference Manual. Так как задачи явно будут нечасто переключаться, то делать прерывания с высокой частотой не нужно. И зачем лишний обработчик? По моему, лучше оставить так, как есть.

А задача, управляющая таймерами - это ведь хорошо, так как расчет и отслеживание таймеров вынесено с уровня ISR. Кстати, чтобы не плодить лишние задачи, почему не модифицировать OSTmrTask() для Вашей задачи?
yes
да, понятно, спасибо.



да, понятно, спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.