Перевод может содержать ошибки. Читайте первоисточник: xStreamBufferCreate(), xStreamBufferCreateWithCallback()
| Назад: [xQueueSelectFromSetFromISR] | Вверх: [ИПП: Буферы потока] | Вперёд: [xStreamBufferCreateWithCallback] |
Функция объявляется в файле stream_buffer.h, кроме того, в проект должен быть включён файл исходного кода FreeRTOS/source/stream_buffer.c.
StreamBufferHandle_t xStreamBufferCreate
(
size_t xBufferSizeBytes,
size_t xTriggerLevelBytes
);
Функция создаёт новый буфер потока, используя динамически распределяемую память.
Для того, чтобы функция xStreamBufferCreate() была доступна, параметр configSUPPORT_DYNAMIC_ALLOCATION в файле FreeRTOSConfig.h должен быть установлен в 1 или оставлен неопределённым (по-умолчанию определяется как 1).
Буфер потока выполняет соответствующий обратный вызов после завершения каждой операции отправки и получения. Буферы потока, созданные с помощью вызова xStreamBufferCreate() ИПП, используют общие для всех функции обратного вызова, определяемые с помощью макросов sbSEND_COMPLETED() и sbRECEIVE_COMPLETED(). Если необходимо использовать индивидуальные функции обратного вызова, буферы потока следует создавать вызовом xStreamBufferCreateWithCallback(), в котором такая возможность предусмотрена.
Если требуется размещать буферы потока в статически выделяемой памяти (на этапе компиляции), используйте соответствующие вызовы xStreamBufferCreateStatic() и xStreamBufferCreateStaticWithCallback(). Более подробно отличия динамического и статического распределения ОЗУ описаны здесь.
Параметры
| xBufferSizeBytes | Общее количество байт, которое буфер потока может хранить одновременно. |
| xTriggerLevelBytes | Уровень срабатывания. Это количество байт, которое должно появиться в буфере потока, чтобы задача, заблокированная на ожидании данных в буфере потока, была выведена из заблокированного состояния. Например, если задача заблокирована при чтении из пустого буфера потока, у которого уровень срабатывания установлен равным 1, то задача будет разблокирована, когда в буфер потока будет записан один байт или когда истечёт время блокировки на ожидании данных в буфере потока. Ещё пример: если некая задача заблокирована на чтении пустого буфера потока с установленным уровнем срабатывания 10, то эта задача не будет разблокироваться до тех пор, пока в буфере не накопится как минимум 10 байт или пока не истечёт время блокировки задачи. Если время блокировки читающей задачи истечёт до достижения уровня срабатывания, то задача сможет получить столько байт, сколько будет фактически доступно. Установка уровня срабатывания в 0 приведёт к использованию уровня срабатывания 1. И, разумеется, недопустимо устанавливать уровень срабатывания, превышающий размер буфера. |
Возвращаемое значение
Если возвращается значение NULL, буфер потока не был создан, т.к. не хватило места в доступной FreeRTOS памяти кучи (динамически распределяемой) для размещения структуры данных и области хранения буфера потока.
Если было возвращено ненулевое значение, буфер потока был успешно создан. И возвращённое значение нужно сохранить как хэндлер созданного буфера потока.
Пример использования:
void vAFunction( void )
{
StreamBufferHandle_t xStreamBuffer;
const size_t xStreamBufferSizeBytes = 100;
const size_t xTriggerLevel = 10;
/* Создаём буфер потока, который может содержать до 100 байт
и использует функции, определённые с помощью макросов
sbSEND_COMPLETED() и sbRECEIVE_COMPLETED() в качестве функций
обратного вызова при завершении передачи и приёма данных из
буфера потока.
Память, используемая для размещения структуры буфера потока и
области данных буфера потока выделяется динамически из кучи,
доступной для использования FreeRTOS.
*/
xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel );
if( xStreamBuffer == NULL )
{
/* Для создания буфера потока не хватило места в куче FreeRTOS. */
}
else
{
/* буфер потока был успешно создан и теперь может быть использован. */
}