You are here

RTOS Stream & Message Buffers - Буферы потоков и сообщений

 



[Inter-task communication and synchronisation]

Введение

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

Буфер потока передаёт непрерывный поток байтов. Буфер сообщений передаёт переменные заданной размерности. Буфер сообщений использует буфер потока для собственно передачи данных.

ВАЖНОЕ ЗАМЕЧАНИЕ: Уникальность среди объектов FreeRTOS заключается в том, что буфер потока (а также буфер сообщений, т.к. он работает поверх буфера потока) предполагает, что есть только одна задача, которая пишет в буфер потока, и только одна задача, которая читает из буфера потока. Расположение "писателя" и "читателя" в разных задачах или обработчиках прерывания безопасно, но небезопасно иметь несколько "писателей" либо несколько "читателей". Если всё же в приложении имеется несколько различных "писателей", каждый вызов функций API для записи в буфер (таких как xStreamBufferSend()) необходимо оборачивать в критическую секцию и использовать параметр send block time = 0. Аналогично если имеется несколько "читателей", то каждый вызов функций API для чтения из буфера (таких как xStreamBufferReceive()) необходимо оборачивать в критическую секцию и использовать параметр receive block time = 0.

Дополнительные материалы

По ссылкам ниже находятся страницы с более подробным описанием буферов потока и буферов сообщений. Также там представлены примеры их использования для реализации пересылки данных из прерывания в задачу и от одного процессорного ядра в другое соответственно (?).

Подробнее о буферах потока...
Подробнее о буферах сообщений...