diff --git a/src/RTOScppRingBuffer.h b/src/RTOScppRingBuffer.h index 973fd1d..577055d 100644 --- a/src/RTOScppRingBuffer.h +++ b/src/RTOScppRingBuffer.h @@ -82,25 +82,34 @@ class RingBufferNoSplitBase : public RingBufferBase { template class RingBufferNoSplitDynamic : public RingBufferNoSplitBase { public: - RingBufferNoSplitDynamic(uint32_t buffer_size) - : RingBufferNoSplitBase(xRingbufferCreate(buffer_size, RINGBUF_TYPE_NOSPLIT)) {} + // Size aligned to nearest 4 bytes + 8 bytes per item + static constexpr uint32_t ALIGNED_SIZE = 4 * ((sizeof(T) + 3) / 4) + 8; + + RingBufferNoSplitDynamic(uint32_t length) + : RingBufferNoSplitBase(xRingbufferCreate(length * ALIGNED_SIZE, RINGBUF_TYPE_NOSPLIT)) {} }; -template +template class RingBufferNoSplitStatic : public RingBufferNoSplitBase { public: + // Size aligned to nearest 4 bytes + 8 bytes per item + static constexpr uint32_t ALIGNED_SIZE = 4 * ((sizeof(T) + 3) / 4) + 8; + RingBufferNoSplitStatic() : RingBufferNoSplitBase( - xRingbufferCreateStatic(BUFFER_SIZE, RINGBUF_TYPE_NOSPLIT, _storage, &_tcb)) {} + xRingbufferCreateStatic(LENGTH * ALIGNED_SIZE, RINGBUF_TYPE_NOSPLIT, _storage, &_tcb)) {} private: StaticRingbuffer_t _tcb; - uint8_t _storage[BUFFER_SIZE]; + uint8_t _storage[LENGTH * ALIGNED_SIZE]; }; template class RingBufferNoSplitExternalStorage : public RingBufferNoSplitBase { public: + // Size aligned to nearest 4 bytes + 8 bytes per item + static constexpr uint32_t ALIGNED_SIZE = 4 * ((sizeof(T) + 3) / 4) + 8; + RingBufferNoSplitExternalStorage() : RingBufferNoSplitBase(nullptr) {} @@ -133,25 +142,34 @@ class RingBufferSplitBase : public RingBufferBase { template class RingBufferSplitDynamic : public RingBufferSplitBase { public: - RingBufferSplitDynamic(uint32_t buffer_size) - : RingBufferSplitBase(xRingbufferCreate(buffer_size, RINGBUF_TYPE_ALLOWSPLIT)) {} + // Size aligned to nearest 4 bytes + 8 bytes per item + static constexpr uint32_t ALIGNED_SIZE = 4 * ((sizeof(T) + 3) / 4) + 8; + + RingBufferSplitDynamic(uint32_t length) + : RingBufferSplitBase(xRingbufferCreate(length * ALIGNED_SIZE, RINGBUF_TYPE_ALLOWSPLIT)) {} }; -template +template class RingBufferSplitStatic : public RingBufferSplitBase { public: + // Size aligned to nearest 4 bytes + 8 bytes per item + static constexpr uint32_t ALIGNED_SIZE = 4 * ((sizeof(T) + 3) / 4) + 8; + RingBufferSplitStatic() - : RingBufferSplitBase( - xRingbufferCreateStatic(BUFFER_SIZE, RINGBUF_TYPE_ALLOWSPLIT, _storage, &_tcb)) {} + : RingBufferSplitBase(xRingbufferCreateStatic(LENGTH * ALIGNED_SIZE, + RINGBUF_TYPE_ALLOWSPLIT, _storage, &_tcb)) {} private: StaticRingbuffer_t _tcb; - uint8_t _storage[BUFFER_SIZE]; + uint8_t _storage[LENGTH * ALIGNED_SIZE]; }; template class RingBufferSplitExternalStorage : public RingBufferSplitBase { public: + // Size aligned to nearest 4 bytes + 8 bytes per item + static constexpr uint32_t ALIGNED_SIZE = 4 * ((sizeof(T) + 3) / 4) + 8; + RingBufferSplitExternalStorage() : RingBufferSplitBase(nullptr) {} @@ -183,20 +201,20 @@ class RingBufferByteBase : public RingBufferBase { template class RingBufferByteDynamic : public RingBufferByteBase { public: - RingBufferByteDynamic(uint32_t buffer_size) - : RingBufferByteBase(xRingbufferCreate(buffer_size, RINGBUF_TYPE_BYTEBUF)) {} + RingBufferByteDynamic(uint32_t length) + : RingBufferByteBase(xRingbufferCreate(length, RINGBUF_TYPE_BYTEBUF)) {} }; -template +template class RingBufferByteStatic : public RingBufferByteBase { public: RingBufferByteStatic() : RingBufferByteBase( - xRingbufferCreateStatic(BUFFER_SIZE, RINGBUF_TYPE_BYTEBUF, _storage, &_tcb)) {} + xRingbufferCreateStatic(LENGTH, RINGBUF_TYPE_BYTEBUF, _storage, &_tcb)) {} private: StaticRingbuffer_t _tcb; - uint8_t _storage[BUFFER_SIZE]; + uint8_t _storage[LENGTH]; }; template