Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Мультиплексирование сигналов
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
Vasya777
Здравствуйте!

Насколько понимаю для оповещения процессов о событии используется OS::TEventFlag. А как заставить процесс ожидать событие от какого-либо одного из нескольких источников.

Допустим есть несколько прерываний, которые обрабатывает один процесс. Не делать ведь несколько одинаковых процессов или несколько процессов, ждущих прерывания и посылающих сигнал обрабатывающему процессу. Есть ли какой-нибудь способ решения этой задачи?

Заранее большое спасибо за ответ!
AHTOXA
Посмотрите пример 2-Message, это как раз то, что вам нужно. Один процесс получает сообщения от другого процесса и из прерывания.
Ну или можно использовать OS::channel, как в примере 3-Channel.
Vasya777
Спасибо за ответ, всё оказалось проще, а я уж думал надо свой сервис писать.
А почему в message не сделали

CODE

bool wait (T& msg, timeout_t timeout = 0);
INLINE void send(T& msg);
INLINE void send_isr(T& msg);
dxp
QUOTE (Vasya777 @ Jan 13 2013, 00:54) *
Насколько понимаю для оповещения процессов о событии используется OS::TEventFlag. А как заставить процесс ожидать событие от какого-либо одного из нескольких источников.

Допустим есть несколько прерываний, которые обрабатывает один процесс. Не делать ведь несколько одинаковых процессов или несколько процессов, ждущих прерывания и посылающих сигнал обрабатывающему процессу. Есть ли какой-нибудь способ решения этой задачи?

Один и тот же флаг события может сигналить множество источников. Поэтому, если не требуется определять источник, то просто ждёте флага в ожидающем процессе, и сигналите его их каких угодно мест. Если нужно определять источник, то, как уже сказали выше, OS::message.

QUOTE (Vasya777 @ Jan 13 2013, 13:37) *
А почему в message не сделали

CODE

bool wait (T& msg, timeout_t timeout = 0);
INLINE void send(T& msg);
INLINE void send_isr(T& msg);

Это вопрос или что? Если вопрос, то он не понятен.
Vasya777
Цитата(dxp @ Jan 14 2013, 09:58) *
Это вопрос или что? Если вопрос, то он не понятен.


Вопрос. Просто при отправке и приёме сообщения было бы удобно сразу передать/получить его через аргумент функции. Были ведь, наверное, какие-то причины, по которым вместо этого был определён оператор "=".
dxp
QUOTE (Vasya777 @ Jan 15 2013, 21:45) *
Вопрос. Просто при отправке и приёме сообщения было бы удобно сразу передать/получить его через аргумент функции. Были ведь, наверное, какие-то причины, по которым вместо этого был определён оператор "=".

Это сделано из соображений эффективности. Код сервиса сообщений разделён на две части - класс TBaseMessage и шаблон message, в класс вынесен общий код, а в шаблон только та часть, которая зависит от типа сообщений - параметра шаблона. Функции wait(), send(), send_isr() находятся в общей части. Они выполняют общие действия для любых типов сообщений и не зависят от этих типов. Если сделать, как предложили вы, то тогда будет дублирование кода для разных сообщений.

Ваша хотелка понятна - не делать два действия, а сразу в одной функции и загрузка тела сообщения и посылка. Ничего не мешает в таком случае отнаследоваться от OS::message и добавить туда желаемое.
Vasya777
Цитата(dxp @ Jan 16 2013, 14:51) *
Ваша хотелка понятна - не делать два действия, а сразу в одной функции и загрузка тела сообщения и посылка. Ничего не мешает в таком случае отнаследоваться от OS::message и добавить туда желаемое.


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