Changed CircBuffer to take its size as a template parameters. This results in smaller code size and less ram usage because the optimizer knows the size at compile time and it does not need to be stored in ram. It should also be faster because there is no indirection to the heap.

I have not tested this code!
pull/1044/head^2
porkybrain 2015-04-15 17:07:40 +02:00
parent 2198e68f76
commit 250ce08712
2 changed files with 7 additions and 18 deletions

View File

@ -19,20 +19,9 @@
#ifndef CIRCBUFFER_H
#define CIRCBUFFER_H
template <class T>
template <class T, int Size>
class CircBuffer {
public:
CircBuffer(int length) {
write = 0;
read = 0;
size = length + 1;
buf = (T *)malloc(size * sizeof(T));
};
~CircBuffer() {
free(buf);
}
bool isFull() {
return ((write + 1) % size == read);
};
@ -64,10 +53,10 @@ public:
};
private:
volatile uint16_t write;
volatile uint16_t read;
uint16_t size;
T * buf;
volatile uint16_t write{0}; //in case older compilers are targeted this should be done in a constructor
volatile uint16_t read{0};
static constexpr int size{Size+1};
T buf[Size];
};
#endif

View File

@ -56,7 +56,7 @@ public:
* @param connect_blocking define if the connection must be blocked if USB not plugged in
*
*/
USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001, bool connect_blocking = true): USBCDC(vendor_id, product_id, product_release, connect_blocking), buf(128){
USBSerial(uint16_t vendor_id = 0x1f00, uint16_t product_id = 0x2012, uint16_t product_release = 0x0001, bool connect_blocking = true): USBCDC(vendor_id, product_id, product_release, connect_blocking){
settingsChangedCallback = 0;
};
@ -154,7 +154,7 @@ protected:
private:
FunctionPointer rx;
CircBuffer<uint8_t> buf;
CircBuffer<uint8_t,128> buf;
void (*settingsChangedCallback)(int baud, int bits, int parity, int stop);
};