You are here

xQueueSend

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

Назад: [vQueueDelete()] Вверх: [ИПП: Очереди] Вперёд: [xQueueSendFromISR()]

 

xQueueSend()

Функция объявляется в файле 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 );
    }

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