You are here

xQueuePeek

Перевод может содержать ошибки. Читайте первоисточник: xQueuePeek()

Назад: [xQueueOverwriteFromISR] Вверх: [ИПП: Очереди] Вперёд: [xQueuePeekFromISR]

 

xQueuePeek()

Функция объявляется в файле queue.h

BaseType_t xQueuePeek
    (
        QueueHandle_t   xQueue,
        void            *pvBuffer,
        TickType_t      xTicksToWait
 );

Это макрос, вызывающий функцию xQueueGenericReceive().

Это макрос, который считывает значение элемента очереди, БЕЗ удаления элемента из очереди. Значение элемента считывается копированием (НЕ по указателю), поэтому необходимо предоставить буфер достаточного размера. Количество копируемых байт зависит от размера элемента очереди. А размер элемента определяется при создании очереди.

Элемент очереди, значение которого было успешно считано, остаётся в очереди, и доступен для повторного чтения новым вызовом xQueuePeek() или xQueuePeekFromISR(), либо для извлечения из очереди вызовом xQueueReceive() или xQueueReceiveFromISR().

Данный макрос нельзя вызывать из обработчиков прерываний. Используйте xQueuePeekFromISR(), если необходимо считать значение элемента очереди, находясь в обработчике прерывания.

Параметры

xQueue Хэндлер очереди, из которой необходимо считать значение элемента.
pvBuffer Указатель на буфер, в который будут скопированы данные из области хранения очереди. При этом количество байт, скопированное из области хранения очереди в буфер, определяется размером элемента очереди. А собственно размер элемента указывается при создании очереди.
xTicksToWait Максимальное время, в течение которого задача будет блокироваться в ожидании получения элемента из очереди, если очередь пуста на момент вызова. Время задаётся в тиках ядра ОС. Для перевода реального времени в тики ядра ОС следует использовать константу portTICK_PERIOD_MS или макрос pdMS_TO_TICKS(). Если значение xTicksToWait установлено равным 0, то возврат будет выполнен немедленно, без блокировки задачи, даже если очередь пуста. Если значение xTicksToWait установлено равным portMAX_DELAY и INCLUDE_vTaskSuspend во FreeRTOSConfig.h установлен в '1', то задача будет блокироваться на неопределённое время до тех пор, пока в очереди не появится элемент.

Возвращаемое значение

pdTRUE если элемент был получен (считано значение элемента) из очереди. Иначе возвращается pdFALSE .

Пример использования:

struct AMessage
{
    char    ucMessageID;
    char    ucData[20];
} xMessage;

QueueHandle_t xQueue;

/* Задача, в которой создаётся очередь и неё помещаются элементы. */
void vATask( void *pvParameters )
{
    struct AMessage *pxMessage;

    /* Создаём очередь, которая может содержать до 10 указателей на
       структуры типа AMessage. Их желательно передавать по указателю, т.к.
       они содержат относительно большой объём данных. */
    xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
    if( xQueue == 0 )
    {
        /* Ошибка при создании очереди. */
    }

    /* ... */

    /* Отправляем в очередь указатель на объект структуры AMessage.
       Не блокируем задачу на ожидании места, если очередь заполнена. */
    pxMessage = & xMessage;
    xQueueSend( xQueue, (void*) &pxMessage, (TickType_t) 0 );

    /* ... */
}

/* Задача, которая "заглядывает" в очередь. */
void vADifferentTask( void *pvParameters )
{
struct AMessage *pxRxedMessage;

    if( xQueue != 0 )
    {
        /* Заглядываем в созданную очередь, считывая значение элемента.
           Задачу блокируем не более чем на 10 тиков ядра ОС, если
           очередь на момент вызова пуста. */
        if( xQueuePeek( xQueue, &( pxRxedMessage ), (TickType_t) 10 ) )
        {
            /* pcRxedMessage теперь указывает на объект структуры AMessage,
               указатель на которую был помещён в очередь задачей vATask,
               но при этом указатель остаётся в очереди. Вызовом xQueuePeek()
               он оттуда не извлекается. */
        }
    }

    /* ... */
}
Hobby's category: