From 8d993afc5388c5f3d0ff568c607f7fed6bb7390e Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Wed, 26 May 2010 13:26:10 +0000 Subject: Replace ring buffer library in Benito and USBtoSerial projects with the new lightweight ring buffer header to improve reliability. --- Projects/Benito/Lib/LightweightRingBuff.h | 90 ++++++++++++++++++++++ Projects/Benito/Lib/RingBuff.c | 120 ------------------------------ Projects/Benito/Lib/RingBuff.h | 116 ----------------------------- 3 files changed, 90 insertions(+), 236 deletions(-) create mode 100644 Projects/Benito/Lib/LightweightRingBuff.h delete mode 100644 Projects/Benito/Lib/RingBuff.c delete mode 100644 Projects/Benito/Lib/RingBuff.h (limited to 'Projects/Benito/Lib') 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 + #include + + /* 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 - #include - #include - #include - - #include - - /* 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 -- cgit v1.2.3