Перейти к содержанию
    

timeslicing в uCOS то есть внешнее управление не реалтаймовыми задачами

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

 

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

 

кажется, что это можно сделать так :

в uCOS эти вычислительные задачи получают приоритеты ниже самой низкоприоритетной реал-таймовой задачи,

в задачу с высоким (наверно самым высоким) uCOS приоритетом вставляется "шедулер"

высокоприоритетная задача (uCOS priopity=1) срабатывает по периодическому таймеру,

в этой задаче суспендятся эти три вычислительные задачи и инкрементируется счетчик

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

каждое четвертое со средним приоритетом

ну и каждое 8 - с низким

при этом приоритеты означают не приоритеты uCOS, а количество времени, которое процессор тратит на задачу

(возможно равномерное распределение - каждый тик одна задачка суспендится, одна запускается, но это не нужно)

остальное время выделено на статистическую+IDLE

 

ничего я тут не перемудрил?

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

 

может такая фигня есть уже в uCOS? (давно не имел дело с uCOS)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В uC/OS-II тайм-слайсинга и карусели нет. Предложенное работать должно.

 

да, работает, только с таймерами какая-то фигня (то ли я доки не понял, то ли еще что-то)

тикать надо вручную посредством OSTmrSignal(), из этого OSTmrSignal семафор и специальная задача (Task) его ждет

в Альтеровской реализации при разрешении таймеров занимается задача с максимальным приоритетом

и т.п.

 

мне проще сделать таймер в железе (Альтера, NIOS) и к нему этот шедулер прицепить, вроде и код прямее, и "оверхед" меньше,

ну или вешать на hook системного таймера

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне проще сделать таймер в железе (Альтера, NIOS) и к нему этот шедулер прицепить, вроде и код прямее, и "оверхед" меньше,

ну или вешать на hook системного таймера

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...