Здравствуйте
Все мы, программируя embedded устройства, рано или поздно сталкиваемся с разными инструментальными средствами (шедулерами), которые позволяют организовать многозадачность.
Это и горячо любимый в народе UCOS от товарища Лабросса, и другие похожие средства. Чаще всего они выпускаются в виде библиотек.
Эти шедулеры среди прочего предоставляют сервис по созданию задач и средства для межзадачной синхронизации/коммуникации. Чаще всего средства для межзадачной синхронизации называются семафорами. Эти же семафоры используются и для синхронизации задач с внешними событиями (прерываниями).
Работая с некоторыми из таких шедулеров я постоянно натыкался на следующую проблему: задача может ждать семафора ( т.е.события), но не может ждать двух и более семафоров (событий), объединеных какой-либо логической функцией.
Приведу пример: - задача ждет приема по какому-либо каналу связи. Если приема в течении какого-то времени нет, задача должна выйти из ожидания приема и заняться чем-то другим. Обычно такой алгоритм реализуется с помощью спецсемафора с таймаутом. В то время, как логичный путь решения проблемы - дать возможность задаче ждать события приема ИЛИ события срабатывания таймера.
Более общий случай - ожидания трех событий, объединенных по ИЛИ. Например, ИЛИ нажатие кнопки, ИЛИ приход команды по сети, ИЛИ прерывание по таймеру.
В тех средствах, с которыми я работал, не было возможности ожидать несколько семафоров, связанных произвольной логической функцией. Приходилось на уровне прерывания самому объединять события и только потом выставлять один обобщенный семафор.
Вопросы:
- Знает ли кто-нибудь, как правильно надо построить работу при необходимости синхронизовать задачу не с одним, а с несколькими семафорами?
- Есть ли какие-нибудь шедулеры, которые позволяют ждать нескольких событий, связанных произвольной логической функцией?
- В виндах и юниксе тоже нет средств для объединения нескольких событий на системном уровне. Может быть я хочу странного и эта проблема решается как-то по-другому?
Спасибо Basil.