VSF Documented
stream_buffer.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2026 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18// Clean-room FreeRTOS stream_buffer.h shim for VSF.
19//
20// Contract (single-reader / single-writer):
21// - A stream buffer is a byte-oriented lock-free-ish ring buffer backed
22// by a pair of vsf_sem_t events (one for space-available, one for
23// data-available).
24// - Send blocks up to xTicksToWait until either (a) the full request
25// fits, or (b) the timeout expires, in which case it writes whatever
26// fits and returns the short count.
27// - Receive blocks until the ring holds at least xTriggerLevelBytes of
28// data, or the timeout expires. On return it copies up to
29// xBufferLengthBytes bytes out.
30// - FromISR variants never block; they do the I/O that can complete
31// immediately and report the byte count.
32
33#ifndef __VSF_FREERTOS_STREAM_BUFFER_H__
34#define __VSF_FREERTOS_STREAM_BUFFER_H__
35
36#include "FreeRTOS.h"
37#include <stddef.h>
38
39#if defined(__VSF_FREERTOS_STREAM_BUFFER_CLASS_IMPLEMENT)
40# undef __VSF_FREERTOS_STREAM_BUFFER_CLASS_IMPLEMENT
41# define __VSF_CLASS_IMPLEMENT__
42#endif
43
44#include "utilities/ooc_class.h"
45
46#ifdef __cplusplus
47extern "C" {
48#endif
49
50/*============================ TYPES =========================================*/
51
52// Forward-declared vsf_class. StreamBufferHandle_t is a StaticStreamBuffer_t *.
53// Message buffers share the exact same layout; message_buffer.h typedefs
54// StaticMessageBuffer_t as an alias to this type.
57
59 private_member(
60 uint8_t * buf;
61 size_t capacity; // buffer size in bytes
62 size_t head; // write index
63 size_t tail; // read index
64 size_t count; // bytes currently stored
65 size_t trigger_level; // receive threshold
66 bool is_message; // message buffer vs stream buffer
67 bool is_static; // true when the control block is user-owned
68 bool is_buf_static; // true when `buf` is user-owned
69 vsf_sem_t data_sem; // posted on bytes-available edge
70 vsf_sem_t space_sem; // posted on space-available edge
71 )
72};
73
74/*============================ API ===========================================*/
75
76extern StreamBufferHandle_t xStreamBufferCreate(size_t xBufferSizeBytes,
77 size_t xTriggerLevelBytes);
78extern void vStreamBufferDelete(StreamBufferHandle_t xStreamBuffer);
79
80// Zero-heap create. The caller provides BOTH the ring storage
81// (xBufferSizeBytes bytes) and the control-block buffer. Neither is
82// freed by vStreamBufferDelete.
84 size_t xBufferSizeBytes,
85 size_t xTriggerLevelBytes,
86 uint8_t *pucStreamBufferStorageArea,
87 StaticStreamBuffer_t *pxStaticStreamBuffer);
88
89// Writes up to xDataLengthBytes bytes. Blocks up to xTicksToWait while
90// there is not enough space for the full payload; copies the prefix
91// that fits on timeout. Returns the byte count actually written.
92extern size_t xStreamBufferSend(StreamBufferHandle_t xStreamBuffer,
93 const void *pvTxData,
94 size_t xDataLengthBytes,
95 TickType_t xTicksToWait);
96
97// Non-blocking ISR variant. pxHigherPriorityTaskWoken may be NULL.
98// Returns bytes written (0..xDataLengthBytes).
99extern size_t xStreamBufferSendFromISR(StreamBufferHandle_t xStreamBuffer,
100 const void *pvTxData,
101 size_t xDataLengthBytes,
102 BaseType_t *pxHigherPriorityTaskWoken);
103
104// Reads up to xBufferLengthBytes bytes. Blocks until the ring holds at
105// least xTriggerLevelBytes of data (or the buffer is full) or the
106// timeout expires. Returns the byte count copied to pvRxData.
107extern size_t xStreamBufferReceive(StreamBufferHandle_t xStreamBuffer,
108 void *pvRxData,
109 size_t xBufferLengthBytes,
110 TickType_t xTicksToWait);
111
112extern size_t xStreamBufferReceiveFromISR(StreamBufferHandle_t xStreamBuffer,
113 void *pvRxData,
114 size_t xBufferLengthBytes,
115 BaseType_t *pxHigherPriorityTaskWoken);
116
117extern BaseType_t xStreamBufferIsEmpty(const StreamBufferHandle_t xStreamBuffer);
118extern BaseType_t xStreamBufferIsFull(const StreamBufferHandle_t xStreamBuffer);
119extern size_t xStreamBufferBytesAvailable(const StreamBufferHandle_t xStreamBuffer);
120extern size_t xStreamBufferSpacesAvailable(const StreamBufferHandle_t xStreamBuffer);
121
123 size_t xTriggerLevelBytes);
125
126#ifdef __cplusplus
127}
128#endif
129
130#endif // __VSF_FREERTOS_STREAM_BUFFER_H__
Definition stream_buffer.h:58
Definition vsf_eda.h:867
long BaseType_t
Definition esp_ringbuf.h:50
#define vsf_dcl_class
Definition ooc_class.h:50
#define vsf_class(__name)
Definition ooc_class.h:52
uint32_t TickType_t
Definition rtos_al.h:59
unsigned char uint8_t
Definition stdint.h:5
BaseType_t xStreamBufferReset(StreamBufferHandle_t xStreamBuffer)
Definition freertos_stream_buffer_port.c:482
StreamBufferHandle_t xStreamBufferCreate(size_t xBufferSizeBytes, size_t xTriggerLevelBytes)
Definition freertos_stream_buffer_port.c:228
BaseType_t xStreamBufferIsEmpty(const StreamBufferHandle_t xStreamBuffer)
Definition freertos_stream_buffer_port.c:443
void vStreamBufferDelete(StreamBufferHandle_t xStreamBuffer)
Definition freertos_stream_buffer_port.c:245
BaseType_t xStreamBufferSetTriggerLevel(StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevelBytes)
Definition freertos_stream_buffer_port.c:469
BaseType_t xStreamBufferIsFull(const StreamBufferHandle_t xStreamBuffer)
Definition freertos_stream_buffer_port.c:449
size_t xStreamBufferBytesAvailable(const StreamBufferHandle_t xStreamBuffer)
Definition freertos_stream_buffer_port.c:456
size_t xStreamBufferSpacesAvailable(const StreamBufferHandle_t xStreamBuffer)
Definition freertos_stream_buffer_port.c:462
size_t xStreamBufferSendFromISR(StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, BaseType_t *pxHigherPriorityTaskWoken)
Definition freertos_stream_buffer_port.c:310
size_t xStreamBufferSend(StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait)
Definition freertos_stream_buffer_port.c:262
StreamBufferHandle_t xStreamBufferCreateStatic(size_t xBufferSizeBytes, size_t xTriggerLevelBytes, uint8_t *pucStreamBufferStorageArea, StaticStreamBuffer_t *pxStaticStreamBuffer)
Definition freertos_stream_buffer_port.c:234
size_t xStreamBufferReceiveFromISR(StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, BaseType_t *pxHigherPriorityTaskWoken)
Definition freertos_stream_buffer_port.c:403
size_t xStreamBufferReceive(StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait)
Definition freertos_stream_buffer_port.c:344
uint16_t tail
Definition vsf_queue.h:632
uint16_t head
Definition vsf_queue.h:632
Generated from commit: vsfteam/vsf@015f4d1