Jump to content

    
Sign in to follow this  
yes

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

Recommended Posts

есть система, в которой реалтаймовая часть (прерывания, флаги/семафоры и т.п.) взаимодействует с некими вычислительными задачами, которые являются вычислениями и время завершения цикла неопределено и большое (ну и код соответственно большой/ветвистый и вставить в него ожидание каких-то событий типа 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 тайм-слайсинга и карусели нет. Предложенное работать должно.

 

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

тикать надо вручную посредством 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this