aboutsummaryrefslogtreecommitdiffstats
path: root/Projects
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-06-06 13:49:50 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-06-06 13:49:50 +0000
commitc2e340320c15e36c7405ad0dcb9c14f1a4929b83 (patch)
tree03b47407f0907cc8040217df81ccb2667e3cd515 /Projects
parent2dabb4e55f1c362f63ef181469f529867ce8b03b (diff)
downloadlufa-c2e340320c15e36c7405ad0dcb9c14f1a4929b83.tar.gz
lufa-c2e340320c15e36c7405ad0dcb9c14f1a4929b83.tar.bz2
lufa-c2e340320c15e36c7405ad0dcb9c14f1a4929b83.zip
Document lightweight ring buffer header files.
Diffstat (limited to 'Projects')
-rw-r--r--Projects/Benito/Lib/LightweightRingBuff.h68
-rw-r--r--Projects/USBtoSerial/Lib/LightweightRingBuff.h70
2 files changed, 99 insertions, 39 deletions
diff --git a/Projects/Benito/Lib/LightweightRingBuff.h b/Projects/Benito/Lib/LightweightRingBuff.h
index a4b0f8b75..89239ace1 100644
--- a/Projects/Benito/Lib/LightweightRingBuff.h
+++ b/Projects/Benito/Lib/LightweightRingBuff.h
@@ -37,51 +37,81 @@
#define _ULW_RING_BUFF_H_
/* Includes: */
+ #include <util/atomic.h>
+
#include <stdint.h>
#include <stdbool.h>
/* Defines: */
- /** Size of each ring buffer, in bytes. */
+ /** Size of each ring buffer, in data elements - must be between 1 and 255. */
#define BUFFER_SIZE 128
/** Type of data to store into the buffer. */
#define RingBuff_Data_t uint8_t
/* Type Defines: */
+ /** Type define for a new ring buffer object. Buffers should be initialized via a call to
+ * \ref RingBuffer_InitBuffer() before use.
+ */
typedef struct
{
- RingBuff_Data_t Buffer[BUFFER_SIZE];
- RingBuff_Data_t* In;
- RingBuff_Data_t* Out;
- uint8_t Count;
+ RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */
+ RingBuff_Data_t* In; /**< Current storage location in the circular buffer */
+ RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */
+ uint8_t Count; /**< Total number of bytes stored in the circular buffer */
} RingBuff_t;
/* Inline Functions: */
+ /** Initializes a ring buffer ready for use. Buffers must be initialized via this function
+ * 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
+ */
static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer)
{
- Buffer->In = Buffer->Buffer;
- Buffer->Out = Buffer->Buffer;
+ Buffer->In = Buffer->Buffer;
+ Buffer->Out = Buffer->Buffer;
Buffer->Count = 0;
}
+ /** 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
+ */
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++;
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ *Buffer->In = Data;
+
+ if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
+ Buffer->In = Buffer->Buffer;
+
+ Buffer->Count++;
+ }
}
+ /** Retrieves an element from the ring buffer.
+ *
+ * \ref 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--;
+ RingBuff_Data_t Data;
+
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ Data = *Buffer->Out;
+
+ if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
+ Buffer->Out = Buffer->Buffer;
+
+ Buffer->Count--;
+ }
return Data;
}
diff --git a/Projects/USBtoSerial/Lib/LightweightRingBuff.h b/Projects/USBtoSerial/Lib/LightweightRingBuff.h
index c376ef480..89239ace1 100644
--- a/Projects/USBtoSerial/Lib/LightweightRingBuff.h
+++ b/Projects/USBtoSerial/Lib/LightweightRingBuff.h
@@ -37,51 +37,81 @@
#define _ULW_RING_BUFF_H_
/* Includes: */
+ #include <util/atomic.h>
+
#include <stdint.h>
#include <stdbool.h>
/* Defines: */
- /** Size of each ring buffer, in bytes */
+ /** Size of each ring buffer, in data elements - must be between 1 and 255. */
#define BUFFER_SIZE 128
- /** Type of data to store into the buffer */
+ /** Type of data to store into the buffer. */
#define RingBuff_Data_t uint8_t
/* Type Defines: */
+ /** Type define for a new ring buffer object. Buffers should be initialized via a call to
+ * \ref RingBuffer_InitBuffer() before use.
+ */
typedef struct
{
- RingBuff_Data_t Buffer[BUFFER_SIZE];
- RingBuff_Data_t* In;
- RingBuff_Data_t* Out;
- uint8_t Count;
+ RingBuff_Data_t Buffer[BUFFER_SIZE]; /**< Internal ring buffer data, referenced by the buffer pointers. */
+ RingBuff_Data_t* In; /**< Current storage location in the circular buffer */
+ RingBuff_Data_t* Out; /**< Current retrieval location in the circular buffer */
+ uint8_t Count; /**< Total number of bytes stored in the circular buffer */
} RingBuff_t;
/* Inline Functions: */
+ /** Initializes a ring buffer ready for use. Buffers must be initialized via this function
+ * 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
+ */
static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer)
{
- Buffer->In = Buffer->Buffer;
- Buffer->Out = Buffer->Buffer;
+ Buffer->In = Buffer->Buffer;
+ Buffer->Out = Buffer->Buffer;
Buffer->Count = 0;
}
+ /** 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
+ */
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++;
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ *Buffer->In = Data;
+
+ if (++Buffer->In == &Buffer->Buffer[BUFFER_SIZE])
+ Buffer->In = Buffer->Buffer;
+
+ Buffer->Count++;
+ }
}
+ /** Retrieves an element from the ring buffer.
+ *
+ * \ref 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--;
+ RingBuff_Data_t Data;
+
+ ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
+ {
+ Data = *Buffer->Out;
+
+ if (++Buffer->Out == &Buffer->Buffer[BUFFER_SIZE])
+ Buffer->Out = Buffer->Buffer;
+
+ Buffer->Count--;
+ }
return Data;
}