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

Мультиплексирование сигналов

Здравствуйте!

 

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

 

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

 

Заранее большое спасибо за ответ!

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


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

Посмотрите пример 2-Message, это как раз то, что вам нужно. Один процесс получает сообщения от другого процесса и из прерывания.

Ну или можно использовать OS::channel, как в примере 3-Channel.

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


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

Спасибо за ответ, всё оказалось проще, а я уж думал надо свой сервис писать.

А почему в message не сделали

 

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

Изменено пользователем Vasya777

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


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

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

 

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

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

 

А почему в message не сделали

 

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

Это вопрос или что? Если вопрос, то он не понятен.

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


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

Это вопрос или что? Если вопрос, то он не понятен.

 

Вопрос. Просто при отправке и приёме сообщения было бы удобно сразу передать/получить его через аргумент функции. Были ведь, наверное, какие-то причины, по которым вместо этого был определён оператор "=".

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


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

Вопрос. Просто при отправке и приёме сообщения было бы удобно сразу передать/получить его через аргумент функции. Были ведь, наверное, какие-то причины, по которым вместо этого был определён оператор "=".

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

 

Ваша хотелка понятна - не делать два действия, а сразу в одной функции и загрузка тела сообщения и посылка. Ничего не мешает в таком случае отнаследоваться от OS::message и добавить туда желаемое.

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


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

Ваша хотелка понятна - не делать два действия, а сразу в одной функции и загрузка тела сообщения и посылка. Ничего не мешает в таком случае отнаследоваться от OS::message и добавить туда желаемое.

 

Да надо наследовать, и можно даже существующие функции перегрузить.

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


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

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

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

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

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

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

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

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

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

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