Multi purpose buffer module.
Multipurpose ringbuffer
Since there weren't any ringbuffers available on the internet optimized for 32-Bit ARM operation without unix-calls and dynamic memory... I created one.
This module is a fixed ringbuffer, it does not allocate any memory, it can work as FIFO or LIFO or any other exotic mode depending on your imagination. With a fixed 32Bit element size it is optimized for 32 bit arm processors. Any smaller value will have overhead, any larger value will require a double entry. (not recommended)
I hope you can use it.
Information
This is not a C++ class, it is a C Module. It does work object oriented, however you cannot work on the object, you work with the object.
Import programxIFO_example
Small example for xIFO
xIFO.h
- Committer:
- jeroen3
- Date:
- 2013-10-28
- Revision:
- 0:a04dc0c57d20
- Child:
- 2:6013f6d867e5
File content as of revision 0:a04dc0c57d20:
/** * @file xifo.h * @brief xifo circular buffer * @details xifo supplies object oriented circular buffer with 32 bit size elements. \n * To use either as FIFO (First In First Out) or as FILO (First In Last Out) * * @author Jeroen Lodder * @date April 2013 * @version 2 * * @{ */ /** * Code has been tested on Cortex M0 (LPC1114) * Performance table, number of core clocks * Measured with a timer before and after * r1 = timer->TC * test_function * r2 = timer->TC * * Function Speed Worst Case * * write 69 71 * read_mr 59 59 * read_lr 63 70 * pop_mr 76 78 * pop_lr 45 45 * */ #ifndef _xifo_H_ #define _xifo_H_ #include <inttypes.h> #if defined(__arm__) || defined(__DOXYGEN__) #pragma anon_unions /**< Allow unnamed unions */ #endif /** * @brief Circular Buffer object. * @details This struct holds the object of a circular buffer */ typedef struct { /* Pointers: */ uint32_t *startpool; /**< @brief First element in pool */ uint32_t *endpool; /**< @brief Last element in pool */ uint32_t *read; /**< @brief Read pointer */ uint32_t *write; /**< @brief Write pointer */ /* Variables: */ uint32_t full; /**< @brief Flag indicating buffer is full */ uint32_t elementcount;/**< @brief Number of elements used */ uint32_t size; /**< @brief Size of buffer */ /* Locally used in functions to prevent stack use: */ /**< @brief union to prevent lvalue typecasting */ union { uint32_t temp; /**< @brief temp variable and padding for even sized block */ uint32_t *ptemp; /**< @brief temp variable and padding for even sized block */ }; }xifo_t; /** * @brief Circular Buffer memory pool type. */ typedef unsigned int xifo_pool_t; #ifdef __cplusplus extern "C" { #endif /* xifo Common */ void xifo_init(xifo_t *c, uint32_t size, uint32_t *startpool); void xifo_clear(xifo_t *c); uint32_t xifo_write(xifo_t *c, uint32_t data); /* FIFO use */ uint32_t xifo_read_lr(xifo_t *c, uint32_t index); uint32_t xifo_pop_lr(xifo_t *c); /* LIFO use */ uint32_t xifo_read_mr(xifo_t *c, uint32_t index); uint32_t xifo_pop_mr(xifo_t *c); /* Extractors */ uint32_t xifo_get_size(xifo_t *c); uint32_t xifo_get_used(xifo_t *c); uint32_t xifo_get_full(xifo_t *c); uint32_t xifo_get_free(xifo_t *c); #ifdef __cplusplus } #endif #endif //_xifo_H_ /** @} */