diff --git a/components/freertos/include/freertos/ringbuf.h b/components/freertos/include/freertos/ringbuf.h index 259ce0f16..0f23a44e6 100644 --- a/components/freertos/include/freertos/ringbuf.h +++ b/components/freertos/include/freertos/ringbuf.h @@ -77,6 +77,19 @@ typedef enum { */ RingbufHandle_t xRingbufferCreate(size_t buf_length, ringbuf_type_t type); +/** + * @brief Create a ring buffer of type RINGBUF_TYPE_NOSPLIT for a fixed item_size + * + * This API is similar to xRingbufferCreate(), but it will internally allocate + * additional space for the headers. + * + * @param item_size Size of each item to be put into the ring buffer + * @param num_item Maximum number of items the buffer needs to hold simultaneously + * + * @return A RingbufHandle_t handle to the created ringbuffer, or NULL in case of error. + */ +RingbufHandle_t xRingbufferCreateNoSplit(size_t item_size, size_t num_item); + /** * @brief Delete a ring buffer * diff --git a/components/freertos/ringbuf.c b/components/freertos/ringbuf.c index 7ae1723fb..57ca1c6cd 100644 --- a/components/freertos/ringbuf.c +++ b/components/freertos/ringbuf.c @@ -541,6 +541,12 @@ err: return NULL; } +RingbufHandle_t xRingbufferCreateNoSplit(size_t item_size, size_t num_item) +{ + size_t aligned_size = (item_size+3)&~3; + return xRingbufferCreate((aligned_size + sizeof(buf_entry_hdr_t)) * num_item, RINGBUF_TYPE_NOSPLIT); +} + void vRingbufferDelete(RingbufHandle_t ringbuf) { ringbuf_t *rb=(ringbuf_t *)ringbuf; if (rb) {