aboutsummaryrefslogtreecommitdiffstats
path: root/Projects/Benito
diff options
context:
space:
mode:
Diffstat (limited to 'Projects/Benito')
-rw-r--r--Projects/Benito/Benito.c2
-rw-r--r--Projects/Benito/Lib/LightweightRingBuff.h41
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