You are here

xQueueCreate

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

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

 

xQueueCreate()

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

QueueHandle_t xQueueCreate
    (
        UBaseType_t uxQueueLength,
        UBaseType_t uxItemSize
    );

Для включения в код функции создания очереди настройка configSUPPORT_DYNAMIC_ALLOCATION в файле FreeRTOSConfig.h должна быть установлена в 1 , либо не определена (по-умолчанию определяется как 1).

Функция создаёт новую очередь и возвращает хэндлер, с помощью которого можно ссылаться на неё в дальнейшем.

Для каждой очереди требуется ОЗУ, которое используется для хранения состояния очереди (область структуры данных очереди) и для хранения элементов, содержащихся в этой очереди (область хранения очереди).  Если очередь создаётся вызовом функции xQueueCreate(), то необходимое ОЗУ автоматически выделется из кучи FreeRTOS. Если же для создания очереди будет использована функция xQueueCreateStatic(), то ОЗУ должно предоставляться разработчиком приложения. Статическое выделение ОЗУ требует большего количества параметров, но позволяет выделять память статически на этапе компиляции. Более подробно отличия динамического и статического распределения ОЗУ описаны здесь.

Параметры

uxQueueLength Максимальное количество элементов очереди, которые могут храниться в ней одновременно.
uxItemSize Размер в байтах, необходимый для хранения каждого элемента очереди. Элементы добавляются в очередь копированием (не по ссылке), поэтому это число байт, которое будет скопировано для каждого элемента очереди. И разумеется все элементы очереди должны быть одного размера.

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

Если очередь успешно создана, возвращается хэндлер созданной очереди. Если же необходимую для создания очереди память выделить не получилось,  возвращается NULL.

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

/*----------------------------------------------------------------------------*/

/* Определяем структуру относительно большого размера для иллюстрации 
сохранения в очереди не самих элементов, а указателей на элементы. */
struct AMessage
{
    char ucMessageID;
    char ucData[ 20 ];
};

void vATask( void *pvParameters )
{
    /* Хэндлеры очередей. */
    QueueHandle_t xQueue1, xQueue2;

    /* Создаём очередь, которая может содержать до 10 значений типа unsigned long. */
    xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );

    if( xQueue1 == NULL )
    {
        /* Очередь не была создана, и не может быть использована. */
    }

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

    if( xQueue2 == NULL )
    {
        /* Очередь не была создана, и не может быть использована. */
    }

    /* ... Остальной код задачи. */
}
/*----------------------------------------------------------------------------*/
Hobby's category: