Хороший метод для передачи сообщений между встроенными задачами RTOS (но может изящно обрабатывать таймауты сообщений) - PullRequest
2 голосов
/ 26 сентября 2010

Я работаю со встроенной ОСРВ (CMX), но я думаю, что это применимо к любой встроенной ОСРВ.Я хочу передавать сообщения между различными задачами.Проблема в том, что одна задача иногда блокирует любую другую на длительный период времени (несколько секунд).

Так как я больше не жду, когда сообщение будет подтверждено ACK, через ~ 100 мс или около тогоЕсли я отправляю сообщение почтового ящика в течение этого времени, то задача, которая отправила сообщение, больше не ожидает его ответа, но получающая задача получит сообщение и попытается выполнить его.Проблема заключается в том, что в принимающей задаче есть указатель на сообщение, но, поскольку отправляющая задача перемещается, указатель больше не указывает на сообщение, что может вызвать огромные проблемы.

У меня нет способа удалениясообщения, когда они находятся в очереди.Как я могу обработать эту ошибку изящно?

1 Ответ

4 голосов
/ 26 сентября 2010

Этот вопрос на самом деле охватывает несколько различных вопросов / моментов.

Прежде всего, мне интересно, почему одна задача иногда приводит к задержке процессора на несколько секунд.Как правило, это указывает на проблему дизайна.Но я не знаю вашу систему, и может быть, что есть разумное объяснение, поэтому я не буду идти по этой кроличьей норе.

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

Существует как минимум 2 решения этой проблемы.Не зная больше, я не могу сказать, что из этого могло бы быть лучше.

Первый подход заключается в передаче копии сообщения вместо указателя на него.Например, очереди сообщений VxWorks (очевидно, не очереди CMX) ставят в очередь копию сообщения.Я не знаю, поддерживает ли CMX такую ​​модель, и я не знаю, есть ли у вас пропускная способность / память для поддержки такого подхода.Обычно я избегаю такого подхода, когда могу, но иногда он имеет место.

Второй подход, который я использую всякий раз, когда могу в такой ситуации, состоит в том, чтобы отправитель выделял буфер сообщений (обычно из моегособственные пулы msg / buffer, обычно это связанный список блоков памяти фиксированного размера - но это детали реализации - см. это описание "пулов памяти" для иллюстрации того, что яя говорю).В любом случае - после выделения отправитель заполняет данные сообщения, ставит в очередь указатель на сообщение и освобождает контроль (владение) блока памяти (т. Е. Сообщения). Получатель теперь отвечает за освобождение / возврат памяти после прочтения сообщения .

В этом вопросе могут возникнуть другие проблемы, например, что делать, если отправитель "передает "сообщение более чем одному получателю?Как приемники координируют / взаимодействуют, так что только последний читатель освобождает память (сборщик мусора)?Но, надеюсь, из того, что вы спросили, второе решение будет работать для вас.

...