Small library for using circular buffers

Dependents:   CircularBufferExample

This library provides circular buffers. The main difference with other circular buffer libraries is that it does not use dynamic memory allocation for storing data. Instead, the buffer is allocated statically.

Three types of buffer exist by default :

  • SmallCircularBuffer (32 bytes)
  • MediumCircularBuffer (128 bytes)
  • BigCircularBuffer (512 bytes)

You can also define buffers with specific size :

CircularBuffer<4> buffer;    // 4 bytes buffer
CircularBuffer<102> buffer2; // 102 bytes buffer

Import programCircularBufferExample

This example shows how to use the CircularBuffer library.

Committer:
feb11
Date:
Mon Sep 16 14:35:39 2013 +0000
Revision:
0:5d058c917599
Child:
1:9953890d59e2
initial import

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 0:5d058c917599 1 #ifndef CIRCULAR_BUFFER_H
feb11 0:5d058c917599 2 #define CIRCULAR_BUFFER_H
feb11 0:5d058c917599 3
feb11 0:5d058c917599 4 template<size_t T>
feb11 0:5d058c917599 5 class CircularBuffer
feb11 0:5d058c917599 6 {
feb11 0:5d058c917599 7 public :
feb11 0:5d058c917599 8
feb11 0:5d058c917599 9 CircularBuffer();
feb11 0:5d058c917599 10
feb11 0:5d058c917599 11 int read(uint8_t *data, uint32_t length);
feb11 0:5d058c917599 12 int write(uint8_t *data, uint32_t length);
feb11 0:5d058c917599 13
feb11 0:5d058c917599 14 private :
feb11 0:5d058c917599 15
feb11 0:5d058c917599 16 uint32_t readIndex, writeIndex;
feb11 0:5d058c917599 17 uint8_t buffer[T];
feb11 0:5d058c917599 18
feb11 0:5d058c917599 19 };
feb11 0:5d058c917599 20
feb11 0:5d058c917599 21 template<size_t T>
feb11 0:5d058c917599 22 CircularBuffer<T>::CircularBuffer():
feb11 0:5d058c917599 23 readIndex(0),
feb11 0:5d058c917599 24 writeIndex(1)
feb11 0:5d058c917599 25 {
feb11 0:5d058c917599 26 }
feb11 0:5d058c917599 27
feb11 0:5d058c917599 28 template<size_t T>
feb11 0:5d058c917599 29 int CircularBuffer<T>::read(uint8_t *data, uint32_t length)
feb11 0:5d058c917599 30 {
feb11 0:5d058c917599 31 uint32_t read = 0;
feb11 0:5d058c917599 32 while((readIndex+1)%T != writeIndex && read < length)
feb11 0:5d058c917599 33 {
feb11 0:5d058c917599 34 data[read++] = buffer[readIndex++];
feb11 0:5d058c917599 35 if(readIndex == T)
feb11 0:5d058c917599 36 readIndex = 0;
feb11 0:5d058c917599 37 }
feb11 0:5d058c917599 38
feb11 0:5d058c917599 39 return read;
feb11 0:5d058c917599 40 }
feb11 0:5d058c917599 41
feb11 0:5d058c917599 42 template<size_t T>
feb11 0:5d058c917599 43 int CircularBuffer<T>::write(uint8_t *data, uint32_t length)
feb11 0:5d058c917599 44 {
feb11 0:5d058c917599 45 uint32_t wrote = 0;
feb11 0:5d058c917599 46 while(writeIndex != readIndex && wrote < length)
feb11 0:5d058c917599 47 {
feb11 0:5d058c917599 48 buffer[writeIndex++] = data[wrote++];
feb11 0:5d058c917599 49 if(writeIndex == T)
feb11 0:5d058c917599 50 writeIndex = 0;
feb11 0:5d058c917599 51 }
feb11 0:5d058c917599 52
feb11 0:5d058c917599 53 return wrote;
feb11 0:5d058c917599 54 }
feb11 0:5d058c917599 55
feb11 0:5d058c917599 56 typedef CircularBuffer<32> SmallCircularBuffer;
feb11 0:5d058c917599 57 typedef CircularBuffer<128> MediumCircularBuffer;
feb11 0:5d058c917599 58 typedef CircularBuffer<512> BigCircularBuffer;
feb11 0:5d058c917599 59
feb11 0:5d058c917599 60 #endif