diff options
Diffstat (limited to 'Projects/USBtoSerial/Lib/LightweightRingBuff.h')
-rw-r--r-- | Projects/USBtoSerial/Lib/LightweightRingBuff.h | 41 |
1 files changed, 37 insertions, 4 deletions
diff --git a/Projects/USBtoSerial/Lib/LightweightRingBuff.h b/Projects/USBtoSerial/Lib/LightweightRingBuff.h index 1dc05935c..9c25707b4 100644 --- a/Projects/USBtoSerial/Lib/LightweightRingBuff.h +++ b/Projects/USBtoSerial/Lib/LightweightRingBuff.h @@ -75,12 +75,12 @@ Buffer->Count = 0; } - /** Inserts an element into the ring buffer. + /** Atomically inserts an element into the ring buffer. * * \param[in,out] Buffer Pointer to a ring buffer structure to insert into * \param[in] Data Data element to insert into the buffer */ - static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + static inline void RingBuffer_AtomicInsert(RingBuff_t* const Buffer, RingBuff_Data_t Data) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { @@ -93,13 +93,13 @@ } } - /** Retrieves an element from the ring buffer. + /** Atomically retrieves an element from the ring buffer. * * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from * * \return Next data element stored in the buffer */ - static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + static inline RingBuff_Data_t RingBuffer_AtomicRemove(RingBuff_t* const Buffer) { RingBuff_Data_t Data; @@ -116,5 +116,38 @@ return Data; } + /** Inserts an element into the ring buffer. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to insert into + * \param[in] Data Data element to insert into the buffer + */ + static inline void RingBuffer_Insert(RingBuff_t* const Buffer, RingBuff_Data_t Data) + { + *Buffer->In = Data; + + if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->In = Buffer->Buffer; + + Buffer->Count++; + } + + /** Retrieves an element from the ring buffer. + * + * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from + * + * \return Next data element stored in the buffer + */ + static inline RingBuff_Data_t RingBuffer_Remove(RingBuff_t* const Buffer) + { + RingBuff_Data_t Data = *Buffer->Out; + + if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE]) + Buffer->Out = Buffer->Buffer; + + Buffer->Count--; + + return Data; + } + #endif
\ No newline at end of file |