В средах ОС реального времени вы часто сталкиваетесь с проблемой, заключающейся в том, что вы должны гарантировать выполнение кода по фиксированному графику. Например. у вас может быть функция, которая вызывается точно каждые 10 миллисекунд. Не раньше, не позже.
Чтобы гарантировать такие жесткие временные ограничения, вы должны написать код, который не должен блокировать критичный по времени код ни при каких обстоятельствах.
Здесь нельзя использовать примитивы синхронизации потоков posix из.
Вы никогда не должны блокировать мьютекс или создавать семафор из кода, критичного ко времени, потому что другой процесс / поток уже может заблокировать его. Однако часто вам разрешается разблокировать какой-либо другой поток из кода, критичного по времени (например, выпустить семафор нормально).
В таких средах очереди сообщений являются хорошим выбором для обмена данными, поскольку они предлагают чистый способ передачи данных из одного потока в другой без какой-либо блокировки.
Использование очередей для установки переменных может показаться излишним, но это очень хороший дизайн программного обеспечения. Если вы делаете это таким образом, у вас есть четко определенный интерфейс с вашим критичным по времени кодом.
Также это помогает писать детерминированный код, потому что вы никогда не столкнетесь с проблемой условий гонки. Если вы устанавливаете переменные через очереди сообщений, вы можете быть уверены, что критичный по времени код видит сообщения в том же порядке, в котором они были отправлены. При смешивании прямого доступа к памяти и сообщениям вы не можете гарантировать это.