Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 54 стр.

UptoLike

Составители: 

54
фективный механизм доставки асинхронных событий и связанных с ними
данных к системным компонентам.
Рис. 3.7 иллюстрирует прикладной процесс (Producer), который соби-
рает данные от некоторых входных устройств (сенсоров), буферизует их и
посылает к другому прикладному процессу (Consumer) для обработки. Ба-
зовый принцип при асинхронной передаче сообщений заключается в пакет-
ной доставке сообщений, которая увеличивает пропускную способность и
снижает накладные расходы. Данные посылаются как сообщения с опреде-
ленными границами.
Таблица 3.11
Функция Назначение
asyncmsg_channel_create() Создать канал для передачи асинхронных сообщений
asyncmsg_channel_destroy() Уничтожить канал для передачи асинхронных сообщений
asyncmsg_connect_attach() Установить соединение с каналом
asyncmsg_connect_detach() Уничтожить соединение с каналом
asyncmsg_flush() Объединить все сообщения в пакет
asyncmsg_connect_attr() Получить атрибуты соединения
asyncmsg_put()/asyncmsg_putv() Передать сообщение(я) одиночное или векторное
asyncmsg_get() Получить асинхронные сообщения из канала
asyncmsg_free() Освободить буфер сообщений
asyncmsg_malloc() Поместить сообщение в буфер для пересылки
QNX Neutrino обеспечивает несколько системных функций для реали-
зации асинхронного обмена, представленных в табл. 3.11. Данные функции
поддерживают создание и управление асинхронным каналом, создание и
управление соединениями, пакетную буферизацию и обмен сообщениями.
Функция создания асинхронного канала имеет следующий формат:
int asyncmsg_channel_create(unsigned flags, mode_t mode, size_t buffer_size,
unsigned max_num_buffer, const struct sigevent *ev
int (*recvbuf_callback) (size_t bufsize, unsigned num_bufs,
void *bufs[], int flags));
Аргументы:
flags – флаги канала, принимают те же значения что и для функции Сhannel_create();
mode – режим доступа к каналу, подобен режиму доступа к файлу;
buffer_size – размер каждого буфера, используемого для хранения сообщений;
ev – NULL или указатель к структуре, которая должна быть послана как уведомление о
событии. Уведомление доставляется, если очередь была предварительно пуста;
recvbuf_callback – функция, используемая библиотекой, чтобы создать буфер для вхо-
дящих сообщений или освобождения буфера, когда канал освобождается. Если значение этого
аргумента NULL, библиотека будет использовать функции malloc() и free().
Следующий программный фрагмент демонстрирует пересылку не-
скольких сообщений и прием всего пакета сообщений с помощью одно-
кратного вызова функции asyncmsg_get(). Источником и приемником сооб-