Очереди сообщений являются самым универсальным и очень полезным инструментом ОС для обмена информацией между задачами. Очереди позволяют передавать следующее сообщение, не дожидаясь освобождения предыдущего. Очереди сообщений поддерживаются и для указателей на сообщения и для коротких сообщений. Для использования очередей сообщений в программе нужно в файл OSAcfg.h вставить определение констант:
#define OS_ENABLE_QUEUE // Если собираемся использовать очереди // указателей на сообщения #define OS_ENABLE_SQUEUE // Если собираемся использовать очереди // коротких сообщений
Определение этих констант скажет компилятору, что в генерируемый код нужно добавить функции для работы с очередями.
В программе очереди объявляются через типы OST_QUEUE и OST_SQUEUE:
OST_QUEUE queue; // Очередь указателей на сообщения OST_SQUEUE squeue; // Очередь коротких сообщений
Эти определения создают в памяти дескрипторы для работы с очередями, которые содержат информацию о размере очереди, ее заполненности, а также сам указатель на очередь. Для работы с очередями нужно также выделять RAM-память для самой очереди (буфер, куда будут помещаться сообщения).
OST_MSG msg_queue[10]; // Буфер для очереди из 10 сообщений OST_SMSG smsg_queue[15]; // Буфер для очереди из 15 коротких сообщений
Перед работой с очередью, она должна быть создана, т.е. должен быть инициализирован дескриптор очереди:
OS_Queue_Create(queue, msg_queue, 10); // Создаем очередь queue на 10 сообщений. // Сообщения, отправляемые в очередь, будут // храниться в массиве msg_queue.
Только после вызова этого сервиса можно отправлять сообщения в очередь и принимать их.
Если в программе предполагается использование очередей обоих типов и есть уверенность в том, что размерности OST_MSG и OST_SMSG одинаковы, то можно в OSAcfg.h определить константу:
#define OS_QUEUE_SQUEUE_IDENTICAL
Это объединит функции обработки очередей разных типов, тем самым сэкономится ROM-память.
Сервис | Аргументы | Описание | Свойства |
---|---|---|---|
Создание | |||
OS_Queue_Create | (queue, buffer, size) | Создаем очередь сообщений queue, указывая буфер и его размер | |
Отправка | |||
OS_Queue_Send | (queue, message) | Отправляем сообщение с содержимым message в очередь queue с ожиданием свободной ячейки | |
OS_Queue_Send_TO | (queue, message, timeout) | То же, что и OS_Queue_Send, но с выходом по таймауту | |
OS_Queue_Send_Now | (queue, message) | Отправляем сообщение с содержимым message в очередь queue без ожидания свободной ячейки | |
Проверка | |||
bool OS_Queue_Check | (queue) | Проверить, есть ли сообщение в очереди. | |
bool OS_Queue_IsFull | (queue) | Проверка переполненности буфера | |
Ожидание | |||
OS_Queue_Wait | (queue, os_msg_type_var) | Ожидаем сообщение из очереди queue | |
OS_Queue_Wait_TO | (queue, os_msg_type_var, timeout) | То же, что и OS_Queue_Wait, но с выходом по таймауту |
Сервис | Аргументы | Описание | Свойства |
---|---|---|---|
Создание | |||
OS_Squeue_Create | (squeue, buffer, size) | Создаем очередь коротких сообщений squeue, указывая буфер и его размер | |
Отправка | |||
OS_Squeue_Send | (squeue, smessage) | Отправляем сообщение с содержимым smessage в очередь squeue с ожиданием свободной ячейки | |
OS_Squeue_Send_TO | (squeue, smessage, timeout) | То же, что и OS_Squeue_Send, но с выходом по таймауту | |
OS_Squeue_Send_Now | (squeue, smessage) | Отправляем сообщение с содержимым smessage в очередь squeue без ожидания свободной ячейки | |
Проверка | |||
bool OS_Squeue_Check | (squeue) | Проверить, есть ли сообщение в очереди. | |
bool OS_Squeue_IsFull | (squeue) | Проверка переполненности буфера. Возвращает true, если в очереди нет места. | |
Ожидание | |||
OS_Squeue_Wait | (squeue, os_smsg_type_var) | Ожидаем сообщение из очереди squeue | |
OS_Squeue_Wait_TO | (squeue, os_smsg_type_var, timeout) | То же, что и OS_Squeue_Wait, но с выходом по таймауту |