Три первых потока собирают данные с разной частотой обновления; Как их синхронизировать в ветке d?
Нужна ли им синхронизация? Поток d предположительно синтезирует выходные данные C на основе самых последних данных из всех трех очередей. Вы можете просто обновить текущие данные для A / B / C по мере их поступления, а при получении любого из них генерировать D из текущих данных. Если данные должны быть гарантированно «свежими», вы можете пометить время поступления данных и использовать их, только если все они достаточно свежие. Если вам нужно собрать свежие данные из всех трех, вы можете сохранить флаг для всех трех, установить по прибытии и сгенерировать D, когда все три флага установлены одновременно, очищая флаги для следующего набора данных. То, как вы это сделаете, действительно зависит от потребностей приложения, и ваше абстрактное описание не предлагает конкретного решения.
Как лучше всего использовать сигнализацию для оповещения других потоков (событие или сигнал?!)
Очереди сообщений блокируют IPC, поэтому, если вы ожидаете одну очередь, поступление данных будет сигнализировать . Я не знаком с MOS RTOS, но большинство RTOS позволяют блокировать только одну очередь. Вы можете объединить все три очереди A, B и C в одну и включить в сообщение идентификатор источника данных, что может быть проще. Однако часто существуют веские причины для отдельных очередей, и для ожидания данных из нескольких очередей вы можете использовать флаг события семафора или задачи, который задается всякий раз, когда A, B или C помещают данные в свои выходные очереди, тогда D будет ожидать семафор / событие и затем опрос всех трех очередей с нулевым тайм-аутом, пока все три не опустеют, прежде чем вернуться к ожиданию.
У вас та же проблема с потоком E, имеющим две входные очереди.
Практична ли упомянутая архитектура?
Кажется правдоподобным - абстрактный характер вашего описания не позволяет определить, является ли он работоспособным или уместным в вашем конкретном приложении, но, по крайней мере, он не безумен.