aboutsummaryrefslogtreecommitdiff
path: root/Projects/XPLAINBridge/Lib
diff options
context:
space:
mode:
authorDean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28>2010-07-12 07:04:19 +0000
committerDean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28>2010-07-12 07:04:19 +0000
commit8a06ec64960d6b168588a814fcbd82677467dce2 (patch)
tree1bca0a037728a614541ad85290bf64ab12d73ac9 /Projects/XPLAINBridge/Lib
parentaa36f85de2adddc1d6ea661cfa55823d7b1da1eb (diff)
Alter the ring buffer library headers to have both atomic and non-atomic insertion/removal routines. Modify the existing projects so that buffer operations performed in an ISR use the shorted non-atomic versions, as they are already performed in a blocking ISR.
Alter USBtoSerial demo so that it does not enter a blocking loop to send data from the USB to the USART, as this can cause dropped bytes in the reception code if large amounts of data are sent in both directions at the same time. Added a flush timer to the USBtoSerial code for the USART to USB interface, so that multiple bytes can be sent in the same USB packet. git-svn-id: http://lufa-lib.googlecode.com/svn/trunk@1372 d5102386-fcda-11dd-9fdb-3debd5008f28
Diffstat (limited to 'Projects/XPLAINBridge/Lib')
-rw-r--r--Projects/XPLAINBridge/Lib/LightweightRingBuff.h41
1 files changed, 37 insertions, 4 deletions
diff --git a/Projects/XPLAINBridge/Lib/LightweightRingBuff.h b/Projects/XPLAINBridge/Lib/LightweightRingBuff.h
index 1dc05935..9c25707b 100644
--- a/Projects/XPLAINBridge/Lib/LightweightRingBuff.h
+++ b/Projects/XPLAINBridge/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