diff options
Diffstat (limited to 'Projects/Benito')
-rw-r--r-- | Projects/Benito/Benito.c | 2 | ||||
-rw-r--r-- | Projects/Benito/Lib/LightweightRingBuff.h | 41 |
2 files changed, 38 insertions, 5 deletions
diff --git a/Projects/Benito/Benito.c b/Projects/Benito/Benito.c index 3b3a39860..32c663cb6 100644 --- a/Projects/Benito/Benito.c +++ b/Projects/Benito/Benito.c @@ -100,7 +100,7 @@ int main(void) /* Echo bytes from the target to the host via the virtual serial port */ while (Tx_Buffer.Count) { - CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_Remove(&Tx_Buffer)); + CDC_Device_SendByte(&VirtualSerial_CDC_Interface, RingBuffer_AtomicRemove(&Tx_Buffer)); LEDs_TurnOnLEDs(LEDMASK_RX); PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS; diff --git a/Projects/Benito/Lib/LightweightRingBuff.h b/Projects/Benito/Lib/LightweightRingBuff.h index 1dc05935c..9c25707b4 100644 --- a/Projects/Benito/Lib/LightweightRingBuff.h +++ b/Projects/Benito/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 |