Перевод может содержать ошибки. Читайте первоисточник: xStreamBufferCreateStatic(), xStreamBufferCreateStaticWithCallback()
| Назад: [xStreamBufferCreateWithCallback] | Вверх: [ИПП: Буферы потока] | Вперёд: [xStreamBufferCreateStaticWithCallback] |
Функция объявляется в файле stream_buffer.h, кроме того, в проект должен быть включён файл исходного кода FreeRTOS/source/stream_buffer.c.
StreamBufferHandle_t xStreamBufferCreateStatic(
size_t xBufferSizeBytes,
size_t xTriggerLevelBytes,
uint8_t *pucStreamBufferStorageArea,
StaticStreamBuffer_t *pxStaticStreamBuffer );
Функция создаёт новый буфер потока, используя статически выделенную память.
Для того, чтобы функция xStreamBufferCreateStatic() была доступна, параметр configSUPPORT_STATIC_ALLOCATION в файле FreeRTOSConfig.h должен быть установлен в 1 (не определённым оставлять нельзя, т.к. по-умолчанию определяется как 0).
Буфер потока выполняет соответствующий обратный вызов после завершения каждой операции отправки и получения. Буферы потока, созданные с помощью вызова ИПП xStreamBufferCreateStatic(), используют общие для всех функции обратного вызова, определяемые с помощью макросов sbSEND_COMPLETED() и sbRECEIVE_COMPLETED(). Если необходимо использовать индивидуальные функции обратного вызова, буферы потока следует создавать с помощью вызова ИПП xStreamBufferCreateStaticWithCallback(), в котором такая возможность предусмотрена.
Если требуется размещать буферы потока в динамически выделяемой памяти (в куче FreeRTOS), используйте соответствующие вызовы xStreamBufferCreate() и xStreamBufferCreateWithCallback(). Более подробно отличия динамического и статического распределения ОЗУ описаны здесь.
Параметры
| xBufferSizeBytes | Общее количество байт, которое буфер потока может хранить одновременно. |
| xTriggerLevelBytes | Уровень срабатывания. Это количество байт, которое должно появиться в буфере потока, чтобы задача, заблокированная на ожидании данных в буфере потока, была выведена из заблокированного состояния. Например, если задача заблокирована при чтении из пустого буфера потока, у которого уровень срабатывания установлен равным 1, то задача будет разблокирована, когда в буфер потока будет записан один байт или когда истечёт время блокировки на ожидании данных в буфере потока. Ещё пример: если некая задача заблокирована на чтении пустого буфера потока с установленным уровнем срабатывания 10, то эта задача не будет разблокироваться до тех пор, пока в буфере не накопится как минимум 10 байт или пока не истечёт время блокировки задачи. Если время блокировки читающей задачи истечёт до достижения уровня срабатывания, то задача сможет получить столько байт, сколько будет фактически доступно. Установка уровня срабатывания в 0 приведёт к использованию уровня срабатывания 1. И, разумеется, недопустимо устанавливать уровень срабатывания, превышающий размер буфера. |
| pucStreamBufferStorageArea | Параметр должен указывать на массив элементов uint8_t, размером не менее xBufferSizeBytes + 1 байт. Это массив, в который копируются данные при записи в буфер потока. |
| pxStaticStreamBuffer |
Параметр должен указывать на переменную с типом StaticStreamBuffer_t, которая используется для хранения структуры данных буфера потока. |
Возвращаемое значение
Если буфер потока успешно создан, будет возвращён указатель на хэндлер буфера потока.
Если же хотя бы один из параметров pucStreamBufferStorageArea и pxStaticstreamBuffer при вызове был указан равным NULL, то и возвращено будет значение NULL.
Пример использования:
/* Общее количество байтов, которое буфер потока
может хранить в любой момент времени. */
#define STREAM_BUFFER_SIZE_BYTES 1000
/* Место в памяти, где буферы потока фактически хранят данные.
Обратите внимание, что места буферу потока требуется на 1 байт больше,
чем количество одновременно хранимых байт: (STREAM_BUFFER_SIZE_BYTES + 1). */
static uint8_t ucStreamBufferStorage[ STREAM_BUFFER_SIZE_BYTES + 1 ];
/* Переменная для хранения структуры буфера потока. */
StaticStreamBuffer_t xStreamBufferStruct;
void MyFunction( void )
{
StreamBufferHandle_t xStreamBuffer;
const size_t xTriggerLevel = 1;
/* Создаём буфер потока, который использует функции, определенные
с помощью макросов sbSEND\COMPLETED() и sbRECEIVE_COMPLETED(),
в качестве функций обратного вызова для завершения отправки и получения. */
xStreamBuffer = xStreamBufferCreateStatic( STREAM_BUFFER_SIZE_BYTES,
xTriggerLevel,
ucStreamBufferStorage,
&xStreamBufferStruct );
/* Поскольку параметры pucStreamBufferStorageArea и pxStaticStreamBuffer
не были равны NULL, xStreamBuffer также не будет равен NULL и может
использоваться для ссылки на созданный буфер потока в других вызовах
функций ИПП буферов потока. */
/* Здесь может располагаться некоторый код, использующий буфер потока. */
}