diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2010-05-26 13:26:10 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2010-05-26 13:26:10 +0000 |
commit | 8d993afc5388c5f3d0ff568c607f7fed6bb7390e (patch) | |
tree | 6ac1c5a0ca4a7c72bd4ca2ed2e137d9c0549da30 /Projects/Benito/Lib | |
parent | 885170f5b456116d7c40570c36342193a30ed886 (diff) | |
download | lufa-8d993afc5388c5f3d0ff568c607f7fed6bb7390e.tar.gz lufa-8d993afc5388c5f3d0ff568c607f7fed6bb7390e.tar.bz2 lufa-8d993afc5388c5f3d0ff568c607f7fed6bb7390e.zip |
Replace ring buffer library in Benito and USBtoSerial projects with the new lightweight ring buffer header to improve reliability.
Diffstat (limited to 'Projects/Benito/Lib')
-rw-r--r-- | Projects/Benito/Lib/LightweightRingBuff.h | 90 | ||||
-rw-r--r-- | Projects/Benito/Lib/RingBuff.c | 120 | ||||
-rw-r--r-- | Projects/Benito/Lib/RingBuff.h | 116 |
3 files changed, 90 insertions, 236 deletions
diff --git a/Projects/Benito/Lib/LightweightRingBuff.h b/Projects/Benito/Lib/LightweightRingBuff.h new file mode 100644 index 000000000..31430ddd4 --- /dev/null +++ b/Projects/Benito/Lib/LightweightRingBuff.h @@ -0,0 +1,90 @@ +/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2010.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaim all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ *
+ * Ultra lightweight ring buffer, for fast insertion/deletion.
+ */
+
+#ifndef _ULW_RING_BUFF_H_
+#define _ULW_RING_BUFF_H_
+
+ /* Includes: */
+ #include <stdint.h>
+ #include <stdbool.h>
+
+ /* Defines: */
+ /** Size of each ring buffer, in bytes */
+ #define BUFFER_SIZE 128
+
+ /** Type of data to store into the buffer */
+ #define RingBuff_Data_t uint8_t
+
+ /* Type Defines: */
+ typedef struct
+ {
+ RingBuff_Data_t Buffer[BUFFER_SIZE];
+ RingBuff_Data_t* In;
+ RingBuff_Data_t* Out;
+ uint8_t Count;
+ } RingBuff_t;
+
+ /* Inline Functions: */
+ static inline void RingBuffer_InitBuffer(RingBuff_t* const Buffer)
+ {
+ Buffer->In = Buffer->Buffer;
+ Buffer->Out = Buffer->Buffer;
+ Buffer->Count = 0;
+ }
+
+ 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++;
+ }
+
+ 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 diff --git a/Projects/Benito/Lib/RingBuff.c b/Projects/Benito/Lib/RingBuff.c deleted file mode 100644 index 91c61d06b..000000000 --- a/Projects/Benito/Lib/RingBuff.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -#include "RingBuff.h" - -void Buffer_Initialize(RingBuff_t* const Buffer) -{ - BUFF_ATOMIC_BLOCK - { - Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer; - Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer; - Buffer->Elements = 0; - } -} - -void Buffer_StoreElement(RingBuff_t* const Buffer, RingBuff_Data_t Data) -{ - BUFF_ATOMIC_BLOCK - { - #if defined(BUFF_DROPOLD) - if (Buffer->Elements == BUFF_LENGTH) - { - Buffer->OutPtr++; - - if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH]) - Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer; - } - else - { - Buffer->Elements++; - } - #elif defined(BUFF_DROPNEW) - if (Buffer->Elements == BUFF_LENGTH) - return; - - Buffer->Elements++; - #elif defined(BUFF_NODROPCHECK) - Buffer->Elements++; - #endif - - *(Buffer->InPtr) = Data; - Buffer->InPtr++; - - if (Buffer->InPtr == &Buffer->Buffer[BUFF_LENGTH]) - Buffer->InPtr = (RingBuff_Data_t*)&Buffer->Buffer; - } -} - -RingBuff_Data_t Buffer_GetElement(RingBuff_t* const Buffer) -{ - RingBuff_Data_t BuffData; - - BUFF_ATOMIC_BLOCK - { -#if defined(BUFF_EMPTYRETURNSZERO) - if (!(Buffer->Elements)) - return 0; -#elif !defined(BUFF_NOEMPTYCHECK) - #error No empty buffer check behavior specified. -#endif - - BuffData = *(Buffer->OutPtr); - - Buffer->OutPtr++; - Buffer->Elements--; - - if (Buffer->OutPtr == &Buffer->Buffer[BUFF_LENGTH]) - Buffer->OutPtr = (RingBuff_Data_t*)&Buffer->Buffer; - } - - return BuffData; -} - -#if defined(BUFF_USEPEEK) -RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* const Buffer) -{ - RingBuff_Data_t BuffData; - - BUFF_ATOMIC_BLOCK - { -#if defined(BUFF_EMPTYRETURNSZERO) - if (!(Buffer->Elements)) - return 0; -#elif !defined(BUFF_NOEMPTYCHECK) - #error No empty buffer check behavior specified. -#endif - - BuffData = *(Buffer->OutPtr); - } - - return BuffData; -} -#endif diff --git a/Projects/Benito/Lib/RingBuff.h b/Projects/Benito/Lib/RingBuff.h deleted file mode 100644 index 30dbf104e..000000000 --- a/Projects/Benito/Lib/RingBuff.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/* Buffer Configuration: */ - /* Buffer length - select static size of created ring buffers: */ - #define BUFF_STATICSIZE 255 // Set to the static ring buffer size for all ring buffers (place size after define) - - /* Volatile mode - uncomment to make buffers volatile, for use in ISRs, etc: */ - #define BUFF_VOLATILE // Uncomment to cause all ring buffers to become volatile (and atomic if multi-byte) in access - - /* Drop mode - select behaviour when Buffer_StoreElement called on a full buffer: */ - #define BUFF_DROPOLD // Uncomment to cause full ring buffers to drop the oldest character to make space when full - // #define BUFF_DROPNEW // Uncomment to cause full ring buffers to drop the new character when full - // #define BUFF_NODROPCHECK // Uncomment to ignore full ring buffer checks - checking left to user! - - /* Underflow behaviour - select behaviour when Buffer_GetElement is called with an empty ring buffer: */ - //#define BUFF_EMPTYRETURNSZERO // Uncomment to return 0 when an empty ring buffer is read - #define BUFF_NOEMPTYCHECK // Uncomment to disable checking of empty ring buffers - checking left to user! - - /* Buffer storage type - set the datatype for the stored data */ - #define BUFF_DATATYPE uint8_t // Change to the data type that is going to be stored into the buffer - - /* Peek routine - uncomment to include the peek routine (fetches next byte without removing it from the buffer */ - //#define BUFF_USEPEEK - -#ifndef _RINGBUFF_H_ -#define _RINGBUFF_H_ - - /* Includes: */ - #include <avr/io.h> - #include <avr/interrupt.h> - #include <util/atomic.h> - #include <limits.h> - - #include <LUFA/Common/Common.h> - - /* Defines and checks: */ - #if defined(BUFF_STATICSIZE) - #define BUFF_LENGTH BUFF_STATICSIZE - #else - #error No buffer length specified! - #endif - - #if !(defined(BUFF_DROPOLD) || defined(BUFF_DROPNEW) || defined(BUFF_NODROPCHECK)) - #error No buffer drop mode specified. - #endif - - #if !defined(BUFF_DATATYPE) - #error Ringbuffer storage data type not specified. - #endif - - #if defined(BUFF_VOLATILE) - #define BUFF_MODE volatile - #define BUFF_ATOMIC_BLOCK ATOMIC_BLOCK(ATOMIC_RESTORESTATE) - #else - #define BUFF_MODE - #define BUFF_ATOMIC_BLOCK - #endif - - #if (BUFF_STATICSIZE > LONG_MAX) - #define RingBuff_Elements_t uint64_t - #elif (BUFF_STATICSIZE > INT_MAX) - #define RingBuff_Elements_t uint32_t - #elif (BUFF_STATICSIZE > CHAR_MAX) - #define RingBuff_Elements_t uint16_t - #else - #define RingBuff_Elements_t uint8_t - #endif - - /* Type Defines: */ - typedef BUFF_DATATYPE RingBuff_Data_t; - - typedef BUFF_MODE struct - { - RingBuff_Data_t Buffer[BUFF_LENGTH]; - RingBuff_Data_t* InPtr; - RingBuff_Data_t* OutPtr; - RingBuff_Elements_t Elements; - } RingBuff_t; - - /* Function Prototypes: */ - void Buffer_Initialize(RingBuff_t* const Buff); - void Buffer_StoreElement(RingBuff_t* const Buffer, RingBuff_Data_t Data); - RingBuff_Data_t Buffer_GetElement(RingBuff_t* const Buffer); - #if defined(BUFF_USEPEEK) - RingBuff_Data_t Buffer_PeekElement(const RingBuff_t* const Buffer); - #endif - -#endif |