Перевод может содержать ошибки. Читайте первоисточник: FreeRTOS xQueueSend() API function descriptions
| Назад: [vQueueDelete()] | Вверх: [ИПП: Очереди] | Вперёд: [xQueueSendFromISR()] |
Функция объявляется в файле queue.h
BaseType_t xQueueSend
(
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);Это макрос, который вызвает xQueueGenericSend(). Он включён в состав FreeRTOS для обратной совместимости с версиями, в которых не реализованы макросы xQueueSendToFront() и xQueueSendToBack(). И этот макрос эквивалентен макросу xQueueSendToBack().
Макрос помещает элемент в конец очереди. Элемент размещается копированием (НЕ по ссылке). Данный макрос нельзя вызывать из обработчиков прерываний. Используйте xQueueSendFromISR(), если необходимо поместить элемент в очередь из обработчика прерывания.
Параметры
| xQueue | Хэндлер очереди, в которую необходимо поместить элемент. |
| pvItemToQueue | Указатель на элемент, который будет помещён в очередь. При этом количество байт, скопированное из pvItemToQueue в область хранения очереди, определяется размером элемента очереди. А собственно размер элемента указывается при создании очереди. |
| xTicksToWait | Максимальное время, в течение которого задача будет блокироваться в ожидании освобождения места в очереди, если она уже заполнена. Время задаётся в тиках ядра ОС. Для перевода реального времени в тики ядра ОС следует использовать константу portTICK_PERIOD_MS или макрос pdMS_TO_TICKS(). Если значение xTicksToWait установлено равным 0, то возврат будет выполнен немедленно, без блокировки задачи, даже если очередь уже заполнена. Если значение xTicksToWait установлено равным portMAX_DELAY и INCLUDE_vTaskSuspend во FreeRTOSConfig.h установлен в '1', то задача будет блокироваться на неопределённое время до тех пор, пока в очереди не появится место. |
Возвращаемое значение
pdTRUE если элемент был помещён в очередь. Иначе возвращается errQUEUE_FULL.
Пример использования:
struct AMessage
{
char ucMessageID;
char ucData[ 20 ];
} xMessage;
unsigned long ulVar = 10UL;
void vATask( void *pvParameters )
{
QueueHandle_t xQueue1, xQueue2;
struct AMessage *pxMessage;
/* Создаём очередь, в которой может содержаться до элементов 10 unsigned long. */
xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
/* Создаём очередь, в которой может содержаться до указателей на структуры AMessage.
Их следует передавать по указателю, т.к. сами структуры содержат много данных. */
xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
/* ... */
if( xQueue1 != 0 )
{
/* Отправляем в очередь значение unsigned long. Ждём не более 10 тиков ядра ОС для освобождения необходимого места в очереди. */
if( xQueueSend( xQueue1,
(void *) &ulVar,
(TickType_t) 10 ) != pdPASS )
{
/* Не удалось разместить элемент в очереди даже после ожидания в течение 10 тиков ядра ОС. */
}
}
if( xQueue2 != 0 )
{
/* Отправляем в очередь указатель на объект структуры AMessage. Не блокируем задачу в случае заполненности очереди. */
pxMessage = & xMessage;
xQueueSend( xQueue2,
(void *) &pxMessage,
(TickType_t) 0 );
}
/* ... */
}