@@ -29,11 +29,17 @@ extern "C" {
29
29
/* The limit is used by algorithm for distinguishing between empty and full
30
30
* state.
31
31
*/
32
- #define RING_BUFFER_MAX_SIZE 0x80000000U
33
- #define RING_BUFFER_SIZE_ASSERT_MSG \
34
- "Size too big"
32
+ #ifdef CONFIG_RING_BUFFER_LARGE
33
+ typedef uint32_t ring_buf_idx_t ;
34
+ #define RING_BUFFER_MAX_SIZE (UINT32_MAX / 2)
35
+ #else
36
+ typedef uint16_t ring_buf_idx_t ;
37
+ #define RING_BUFFER_MAX_SIZE (UINT16_MAX / 2)
38
+ #endif
39
+
40
+ #define RING_BUFFER_SIZE_ASSERT_MSG "Size too big"
35
41
36
- struct ring_buf_index { int32_t head , tail , base ; };
42
+ struct ring_buf_index { ring_buf_idx_t head , tail , base ; };
37
43
38
44
/** @endcond */
39
45
@@ -61,7 +67,7 @@ int ring_buf_area_finish(struct ring_buf *buf, struct ring_buf_index *ring,
61
67
*
62
68
* Any value other than 0 makes sense only in validation testing context.
63
69
*/
64
- static inline void ring_buf_internal_reset (struct ring_buf * buf , int32_t value )
70
+ static inline void ring_buf_internal_reset (struct ring_buf * buf , ring_buf_idx_t value )
65
71
{
66
72
buf -> put .head = buf -> put .tail = buf -> put .base = value ;
67
73
buf -> get .head = buf -> get .tail = buf -> get .base = value ;
@@ -90,7 +96,7 @@ static inline void ring_buf_internal_reset(struct ring_buf *buf, int32_t value)
90
96
* @param size8 Size of ring buffer (in bytes).
91
97
*/
92
98
#define RING_BUF_DECLARE (name , size8 ) \
93
- BUILD_ASSERT(size8 < RING_BUFFER_MAX_SIZE,\
99
+ BUILD_ASSERT(size8 <= RING_BUFFER_MAX_SIZE,\
94
100
RING_BUFFER_SIZE_ASSERT_MSG); \
95
101
static uint8_t __noinit _ring_buffer_data_##name[size8]; \
96
102
struct ring_buf name = RING_BUF_INIT(_ring_buffer_data_##name, size8)
@@ -111,7 +117,7 @@ static inline void ring_buf_internal_reset(struct ring_buf *buf, int32_t value)
111
117
* @param size32 Size of ring buffer (in 32-bit words).
112
118
*/
113
119
#define RING_BUF_ITEM_DECLARE (name , size32 ) \
114
- BUILD_ASSERT((size32) < RING_BUFFER_MAX_SIZE / 4,\
120
+ BUILD_ASSERT((size32) <= RING_BUFFER_MAX_SIZE / 4, \
115
121
RING_BUFFER_SIZE_ASSERT_MSG); \
116
122
static uint32_t __noinit _ring_buffer_data_##name[size32]; \
117
123
struct ring_buf name = { \
@@ -168,7 +174,7 @@ static inline void ring_buf_init(struct ring_buf *buf,
168
174
uint32_t size ,
169
175
uint8_t * data )
170
176
{
171
- __ASSERT (size < RING_BUFFER_MAX_SIZE , RING_BUFFER_SIZE_ASSERT_MSG );
177
+ __ASSERT (size <= RING_BUFFER_MAX_SIZE , RING_BUFFER_SIZE_ASSERT_MSG );
172
178
173
179
buf -> size = size ;
174
180
buf -> buffer = data ;
@@ -192,7 +198,7 @@ static inline void ring_buf_item_init(struct ring_buf *buf,
192
198
uint32_t size ,
193
199
uint32_t * data )
194
200
{
195
- __ASSERT (size < RING_BUFFER_MAX_SIZE / 4 , RING_BUFFER_SIZE_ASSERT_MSG );
201
+ __ASSERT (size <= RING_BUFFER_MAX_SIZE / 4 , RING_BUFFER_SIZE_ASSERT_MSG );
196
202
ring_buf_init (buf , 4 * size , (uint8_t * )data );
197
203
}
198
204
@@ -227,7 +233,9 @@ static inline void ring_buf_reset(struct ring_buf *buf)
227
233
*/
228
234
static inline uint32_t ring_buf_space_get (struct ring_buf * buf )
229
235
{
230
- return buf -> size - (buf -> put .head - buf -> get .tail );
236
+ ring_buf_idx_t allocated = buf -> put .head - buf -> get .tail ;
237
+
238
+ return buf -> size - allocated ;
231
239
}
232
240
233
241
/**
@@ -255,15 +263,17 @@ static inline uint32_t ring_buf_capacity_get(struct ring_buf *buf)
255
263
}
256
264
257
265
/**
258
- * @brief Determine used space in a ring buffer.
266
+ * @brief Determine size of available data in a ring buffer.
259
267
*
260
268
* @param buf Address of ring buffer.
261
269
*
262
- * @return Ring buffer space used (in bytes).
270
+ * @return Ring buffer data size (in bytes).
263
271
*/
264
272
static inline uint32_t ring_buf_size_get (struct ring_buf * buf )
265
273
{
266
- return buf -> put .tail - buf -> get .head ;
274
+ ring_buf_idx_t available = buf -> put .tail - buf -> get .head ;
275
+
276
+ return available ;
267
277
}
268
278
269
279
/**
0 commit comments