You are here

xQueueCreateStatic

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

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

 

xQueueCreateStatic()

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

QueueHandle_t xQueueCreateStatic
    (
        UBaseType_t     uxQueueLength,
        UBaseType_t     uxItemSize,
        uint8_t         *pucQueueStorageBuffer,
        StaticQueue_t   *pxQueueBuffer
    );

Для включения в код функции создания очереди настройка configSUPPORT_STATIC_ALLOCATION в файле FreeRTOSConfig.h должна быть установлена в 1.

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

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

Параметры

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

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

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

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

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

/* Будем создавать очередь для хранения одновременно до 10 элементов с типом uint64_t. */
#define QUEUE_LENGTH    10
#define ITEM_SIZE       sizeof( uint64_t )

/* Переменная, используемая для хранения структуры данных очереди. */
static StaticQueue_t    xStaticQueue;

/* Массив, используемый для хранения элементов очереди (область хранения очереди).
Он должен содержать не менее (uxQueueLength * uxItemSize) байт. */
uint8_t ucQueueStorageArea[ QUEUE_LENGTH * ITEM_SIZE ];

void vATask( void *pvParameters )
{
    /* Хэндлер очереди. */
    QueueHandle_t xQueue;

    /* Создаём очередь, которая может содержать до 10 элементов с типом uint64_t. */
    xQueue = xQueueCreateStatic(    QUEUE_LENGTH,
                                    ITEM_SIZE,
                                    ucQueueStorageArea,
                                    &xStaticQueue );

    /* pxQueueBuffer был не NULL, поэтому и xQueue не должен быть NULL. */
    configASSERT( xQueue );
}
/*----------------------------------------------------------------------------*/
Hobby's category: