X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/c2e340320c15e36c7405ad0dcb9c14f1a4929b83..666c0fa4c31b2c9f7f02f6d0e09551e24dc4680c:/Projects/USBtoSerial/Lib/LightweightRingBuff.h diff --git a/Projects/USBtoSerial/Lib/LightweightRingBuff.h b/Projects/USBtoSerial/Lib/LightweightRingBuff.h index 89239ace1..9c25707b4 100644 --- a/Projects/USBtoSerial/Lib/LightweightRingBuff.h +++ b/Projects/USBtoSerial/Lib/LightweightRingBuff.h @@ -44,7 +44,7 @@ /* Defines: */ /** Size of each ring buffer, in data elements - must be between 1 and 255. */ - #define BUFFER_SIZE 128 + #define BUFFER_SIZE 255 /** Type of data to store into the buffer. */ #define RingBuff_Data_t uint8_t @@ -66,7 +66,7 @@ * before any operations are called upon them. Already initialized buffers may be reset * by re-initializing them using this function. * - * \ref Buffer Pointer to a ring buffer structure to initialize + * \param[out] Buffer Pointer to a ring buffer structure to initialize */ static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer) { @@ -75,12 +75,12 @@ Buffer->Count = 0; } - /** Inserts an element into the ring buffer. + /** Atomically inserts an element into the ring buffer. * - * \ref Buffer Pointer to a ring buffer structure to insert into - * \ref Data Data element to insert into the 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. * - * \ref Buffer Pointer to a ring buffer structure to retrieve from + * \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