Jump to content

    

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

 

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
В uC/OS-II тайм-слайсинга и карусели нет. Предложенное работать должно.

 

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

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

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

и т.п.

 

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

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

Share this post


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

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

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

 

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

Share this post


Link to post
Share on other sites

да, понятно, спасибо.

 

 

 

да, понятно, спасибо.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this