You are here

xQueueSendToFront

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

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

 

xQueueSendToFront()

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

BaseType_t xQueueSendToFront
    (
        QueueHandle_t   xQueue,
        const void      *pvItemToQueue,
        TickType_t      xTicksToWait
    );

Это макрос, который вызвает xQueueGenericSend().

Макрос помещает элемент в начало очереди. Элемент размещается копированием (НЕ по ссылке). Данный макрос нельзя вызывать из обработчиков прерываний. Если необходимо поместить элемент в очередь из обработчика прерывания, следует использовать xQueueSendToFrontFromISR().

Параметры

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 ) );

    /* Создаём очередь, в которой может содержаться до 10 указателей на структуры AMessage. */
    /* Т.к. эти структуры содержат относительно много данных, их желательно передавать по указателю, а не напрямую. */
    xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );


    /* ... */


    if( xQueue1 != 0 )
    {
        /* Отправляем в очередь значение unsigned long. Ждём не более 10 тиков ядра ОС для освобождения необходимого места в очереди. */
        if( xQueueSendToFront( xQueue1,
                              (void *) &ulVar,
                              (TickType_t) 10 ) != pdPASS )
        {
            /* Не удалось разместить элемент в очереди даже после ожидания в течение 10 тиков ядра ОС. */
        }
    }

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

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