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

Committer:
jeroen3
Date:
Fri Apr 04 21:36:55 2014 +0000
Revision:
2:6013f6d867e5
Parent:
0:a04dc0c57d20
major revision, now supports multiple C formats and Templates C++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jeroen3 2:6013f6d867e5 1 /**
jeroen3 0:a04dc0c57d20 2 * @file xifo.h
jeroen3 2:6013f6d867e5 3 * @brief xifo circular buffer for all elements
jeroen3 2:6013f6d867e5 4 * @details xifo supplies object oriented circular buffer with x bit size elements. \n
jeroen3 2:6013f6d867e5 5 * To use either as FIFO (First In First Out) or as FILO (First In Last Out)
jeroen3 2:6013f6d867e5 6 * Below are defines to disable or enable any xIFO type you like.
jeroen3 0:a04dc0c57d20 7 *
jeroen3 2:6013f6d867e5 8 * @author Jeroen Lodder
jeroen3 2:6013f6d867e5 9 * @date March 2014
jeroen3 2:6013f6d867e5 10 * @version 3
jeroen3 2:6013f6d867e5 11 *
jeroen3 2:6013f6d867e5 12 * Copyright (c) 2014 Jeroen Lodder
jeroen3 2:6013f6d867e5 13 *
jeroen3 2:6013f6d867e5 14 * Permission is hereby granted, free of charge, to any person obtaining a copy
jeroen3 2:6013f6d867e5 15 * of this software and associated documentation files (the "Software"), to deal
jeroen3 2:6013f6d867e5 16 * in the Software without restriction, including without limitation the rights
jeroen3 2:6013f6d867e5 17 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
jeroen3 2:6013f6d867e5 18 * copies of the Software, and to permit persons to whom the Software is
jeroen3 2:6013f6d867e5 19 * furnished to do so, subject to the following conditions:
jeroen3 2:6013f6d867e5 20 *
jeroen3 2:6013f6d867e5 21 * The above copyright notice and this permission notice shall be included in all
jeroen3 2:6013f6d867e5 22 * copies or substantial portions of the Software.
jeroen3 2:6013f6d867e5 23 *
jeroen3 2:6013f6d867e5 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
jeroen3 2:6013f6d867e5 25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
jeroen3 2:6013f6d867e5 26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
jeroen3 2:6013f6d867e5 27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
jeroen3 2:6013f6d867e5 28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jeroen3 2:6013f6d867e5 29 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
jeroen3 2:6013f6d867e5 30 * SOFTWARE.
jeroen3 0:a04dc0c57d20 31 *
jeroen3 0:a04dc0c57d20 32 * @{
jeroen3 0:a04dc0c57d20 33 */
jeroen3 0:a04dc0c57d20 34 #ifndef _xifo_H_
jeroen3 0:a04dc0c57d20 35 #define _xifo_H_
jeroen3 2:6013f6d867e5 36
jeroen3 0:a04dc0c57d20 37 #include <inttypes.h>
jeroen3 0:a04dc0c57d20 38
jeroen3 2:6013f6d867e5 39 #if !defined(TRUE) || defined(__DOXYGEN__)
jeroen3 2:6013f6d867e5 40 #define TRUE (1)
jeroen3 2:6013f6d867e5 41 #endif
jeroen3 2:6013f6d867e5 42 #if !defined(FALSE) || defined(__DOXYGEN__)
jeroen3 2:6013f6d867e5 43 #define FALSE !(TRUE)
jeroen3 2:6013f6d867e5 44 #endif
jeroen3 2:6013f6d867e5 45
jeroen3 2:6013f6d867e5 46 #ifdef __cplusplus
jeroen3 2:6013f6d867e5 47 #if !defined(xIFO_USE_CPP) || defined(__DOXYGEN__)
jeroen3 2:6013f6d867e5 48 #define xIFO_USE_CPP TRUE
jeroen3 2:6013f6d867e5 49 #endif
jeroen3 2:6013f6d867e5 50 #endif
jeroen3 2:6013f6d867e5 51
jeroen3 2:6013f6d867e5 52 #if !defined(xIFO_USE_64BIT) || defined(__DOXYGEN__)
jeroen3 2:6013f6d867e5 53 #define xIFO_USE_64BIT TRUE
jeroen3 2:6013f6d867e5 54 #endif
jeroen3 2:6013f6d867e5 55
jeroen3 2:6013f6d867e5 56 #if !defined(xIFO_USE_32BIT) || defined(__DOXYGEN__)
jeroen3 2:6013f6d867e5 57 #define xIFO_USE_32BIT TRUE
jeroen3 2:6013f6d867e5 58 #endif
jeroen3 2:6013f6d867e5 59
jeroen3 2:6013f6d867e5 60 #if !defined(xIFO_USE_16BIT) || defined(__DOXYGEN__)
jeroen3 2:6013f6d867e5 61 #define xIFO_USE_16BIT TRUE
jeroen3 2:6013f6d867e5 62 #endif
jeroen3 2:6013f6d867e5 63
jeroen3 2:6013f6d867e5 64 #if !defined(xIFO_USE_8BIT) || defined(__DOXYGEN__)
jeroen3 2:6013f6d867e5 65 #define xIFO_USE_8BIT TRUE
jeroen3 0:a04dc0c57d20 66 #endif
jeroen3 0:a04dc0c57d20 67
jeroen3 2:6013f6d867e5 68
jeroen3 2:6013f6d867e5 69 #if xIFO_USE_CPP == TRUE
jeroen3 2:6013f6d867e5 70 /**
jeroen3 2:6013f6d867e5 71 * @brief Circular Buffer object.
jeroen3 2:6013f6d867e5 72 * @details This class holds the object of a circular buffer
jeroen3 2:6013f6d867e5 73 */
jeroen3 2:6013f6d867e5 74 template <class xifo_dtype>
jeroen3 2:6013f6d867e5 75 class Xifo
jeroen3 2:6013f6d867e5 76 {
jeroen3 2:6013f6d867e5 77 public:
jeroen3 2:6013f6d867e5 78 /**
jeroen3 2:6013f6d867e5 79 * @brief Initialise xifo.
jeroen3 2:6013f6d867e5 80 * @note Does not clear memory pool.
jeroen3 2:6013f6d867e5 81 * @param[in] Number of elements buffer can hold (size).
jeroen3 2:6013f6d867e5 82 */
jeroen3 2:6013f6d867e5 83 Xifo(uint32_t size)
jeroen3 2:6013f6d867e5 84 {
jeroen3 2:6013f6d867e5 85 startpool = new xifo_dtype[size];
jeroen3 2:6013f6d867e5 86 endpool = &startpool[size-1];
jeroen3 2:6013f6d867e5 87 isize = size;
jeroen3 2:6013f6d867e5 88 ifull = 0;
jeroen3 2:6013f6d867e5 89 icount = 0;
jeroen3 2:6013f6d867e5 90 read = startpool;
jeroen3 2:6013f6d867e5 91 pwrite = startpool;
jeroen3 2:6013f6d867e5 92 }
jeroen3 2:6013f6d867e5 93
jeroen3 2:6013f6d867e5 94 /**
jeroen3 2:6013f6d867e5 95 * @brief Initialise xifo.
jeroen3 2:6013f6d867e5 96 * @note Does not clear memory pool.
jeroen3 2:6013f6d867e5 97 * @param[in] Number of elements buffer can hold (size).
jeroen3 2:6013f6d867e5 98 * @param[in] Start of pre-allocated memory pool.
jeroen3 2:6013f6d867e5 99 */
jeroen3 2:6013f6d867e5 100 Xifo(uint32_t size, xifo_dtype *sp)
jeroen3 2:6013f6d867e5 101 {
jeroen3 2:6013f6d867e5 102 startpool = sp;
jeroen3 2:6013f6d867e5 103 endpool = &sp[size-1];
jeroen3 2:6013f6d867e5 104 isize = size;
jeroen3 2:6013f6d867e5 105 ifull = 0;
jeroen3 2:6013f6d867e5 106 icount = 0;
jeroen3 2:6013f6d867e5 107 read = sp;
jeroen3 2:6013f6d867e5 108 pwrite = sp;
jeroen3 2:6013f6d867e5 109 }
jeroen3 2:6013f6d867e5 110
jeroen3 2:6013f6d867e5 111 /**
jeroen3 2:6013f6d867e5 112 * @brief Deinitialise (and deallocate) buffer xifo.
jeroen3 2:6013f6d867e5 113 * @note Does not clear memory pool.
jeroen3 2:6013f6d867e5 114 */
jeroen3 2:6013f6d867e5 115 ~Xifo(void)
jeroen3 2:6013f6d867e5 116 {
jeroen3 2:6013f6d867e5 117 if(dynamic){
jeroen3 2:6013f6d867e5 118 delete startpool;
jeroen3 2:6013f6d867e5 119 }
jeroen3 2:6013f6d867e5 120 }
jeroen3 2:6013f6d867e5 121
jeroen3 2:6013f6d867e5 122 /**
jeroen3 2:6013f6d867e5 123 * @brief Clear buffer memory pool
jeroen3 2:6013f6d867e5 124 * @note Must be used on initialised buffer object.
jeroen3 2:6013f6d867e5 125 * @param[in] c Pointer to @p xifo_SIZETYPE_t object.
jeroen3 2:6013f6d867e5 126 */
jeroen3 2:6013f6d867e5 127 void clear(void)
jeroen3 2:6013f6d867e5 128 {
jeroen3 2:6013f6d867e5 129 register xifo_dtype *ptemp = startpool;
jeroen3 2:6013f6d867e5 130 while(ptemp <= endpool){
jeroen3 2:6013f6d867e5 131 *ptemp++ = 0;
jeroen3 2:6013f6d867e5 132 }
jeroen3 2:6013f6d867e5 133 }
jeroen3 2:6013f6d867e5 134
jeroen3 2:6013f6d867e5 135 /**
jeroen3 2:6013f6d867e5 136 * @brief Reset buffer
jeroen3 2:6013f6d867e5 137 * @note Must be used on initialised buffer object.
jeroen3 2:6013f6d867e5 138 * @param[in] c Pointer to @p xifo_SIZETYPE_t object.
jeroen3 2:6013f6d867e5 139 */
jeroen3 2:6013f6d867e5 140 void reset(void)
jeroen3 2:6013f6d867e5 141 {
jeroen3 2:6013f6d867e5 142 register xifo_dtype *ptemp = startpool;
jeroen3 2:6013f6d867e5 143 while(ptemp <= endpool){
jeroen3 2:6013f6d867e5 144 *ptemp++ = 0;
jeroen3 2:6013f6d867e5 145 }
jeroen3 2:6013f6d867e5 146 ifull = 0;
jeroen3 2:6013f6d867e5 147 icount = 0;
jeroen3 2:6013f6d867e5 148 read = startpool;
jeroen3 2:6013f6d867e5 149 pwrite = startpool;
jeroen3 2:6013f6d867e5 150 }
jeroen3 2:6013f6d867e5 151
jeroen3 2:6013f6d867e5 152 /**
jeroen3 2:6013f6d867e5 153 * @brief Write to buffer
jeroen3 2:6013f6d867e5 154 *
jeroen3 2:6013f6d867e5 155 * @note Readpointer is automatically set to the last added element.
jeroen3 2:6013f6d867e5 156 *
jeroen3 2:6013f6d867e5 157 * @warning Consider this opertaion as atomic!
jeroen3 2:6013f6d867e5 158 *
jeroen3 2:6013f6d867e5 159 * @details Adds a value to the buffer.
jeroen3 2:6013f6d867e5 160 * Automatically overwrites oldest elements when full.
jeroen3 2:6013f6d867e5 161 *
jeroen3 2:6013f6d867e5 162 * @param[in] c Pointer to @p xifo_SIZETYPE_t used for configuration.
jeroen3 2:6013f6d867e5 163 * @param[in] data Data to add to buffer
jeroen3 2:6013f6d867e5 164 *
jeroen3 2:6013f6d867e5 165 * @return Number of free buffer elements
jeroen3 2:6013f6d867e5 166 */
jeroen3 2:6013f6d867e5 167 uint32_t write(xifo_dtype data)
jeroen3 2:6013f6d867e5 168 {
jeroen3 2:6013f6d867e5 169 /* Write data */
jeroen3 2:6013f6d867e5 170 *pwrite = data;
jeroen3 2:6013f6d867e5 171 /* Update read pointer to most recent element */
jeroen3 2:6013f6d867e5 172 read = pwrite;
jeroen3 2:6013f6d867e5 173 /* Write pointer increment */
jeroen3 2:6013f6d867e5 174 pwrite += 1;
jeroen3 2:6013f6d867e5 175 /* Validate pointer */
jeroen3 2:6013f6d867e5 176 if( pwrite > endpool){
jeroen3 2:6013f6d867e5 177 /* Exceeded pool boundaries */
jeroen3 2:6013f6d867e5 178 pwrite = startpool;
jeroen3 2:6013f6d867e5 179 }
jeroen3 2:6013f6d867e5 180 /* Update count */
jeroen3 2:6013f6d867e5 181 icount++;
jeroen3 2:6013f6d867e5 182 /* Verify full */
jeroen3 2:6013f6d867e5 183 if( icount >= isize ){
jeroen3 2:6013f6d867e5 184 ifull = 1;
jeroen3 2:6013f6d867e5 185 icount = isize;
jeroen3 2:6013f6d867e5 186 }
jeroen3 2:6013f6d867e5 187 /* return free elements count */
jeroen3 2:6013f6d867e5 188 return isize - icount;
jeroen3 2:6013f6d867e5 189 }
jeroen3 2:6013f6d867e5 190
jeroen3 2:6013f6d867e5 191 /**
jeroen3 2:6013f6d867e5 192 * @brief Read from buffer (lr) Least Recent oriented (fifo)
jeroen3 2:6013f6d867e5 193 *
jeroen3 2:6013f6d867e5 194 * @note Buffer state will be preserved
jeroen3 2:6013f6d867e5 195 *
jeroen3 2:6013f6d867e5 196 * @warning Consider this opertaion as atomic!
jeroen3 2:6013f6d867e5 197 *
jeroen3 2:6013f6d867e5 198 * @details Read n elements from the oldest element to the most recent.
jeroen3 2:6013f6d867e5 199 * As for index[0] the least recently added element is returned.
jeroen3 2:6013f6d867e5 200 * And for index[count] the most recent element is returned.
jeroen3 2:6013f6d867e5 201 * This makes it possible to peek in fifo.
jeroen3 2:6013f6d867e5 202 *
jeroen3 2:6013f6d867e5 203 * @param[in] c Pointer to @p xifo_SIZETYPE_t used for configuration.
jeroen3 2:6013f6d867e5 204 * @param[in] index Index relative from least recent
jeroen3 2:6013f6d867e5 205 *
jeroen3 2:6013f6d867e5 206 * @return Contents of element or 0 if failed (element can hold 0)
jeroen3 2:6013f6d867e5 207 */
jeroen3 2:6013f6d867e5 208 xifo_dtype read_lr(uint32_t index)
jeroen3 2:6013f6d867e5 209 {
jeroen3 2:6013f6d867e5 210 register xifo_dtype *ptemp;
jeroen3 2:6013f6d867e5 211 /* Verify there is valid data to read */
jeroen3 2:6013f6d867e5 212 if(index+1 > icount){
jeroen3 2:6013f6d867e5 213 return 0;
jeroen3 2:6013f6d867e5 214 }
jeroen3 2:6013f6d867e5 215 /* Calculate index of oldest element */
jeroen3 2:6013f6d867e5 216 index = (icount-1) - index;
jeroen3 2:6013f6d867e5 217 /* Set pointer */
jeroen3 2:6013f6d867e5 218 ptemp = (read) - index;
jeroen3 2:6013f6d867e5 219 if(ptemp < startpool){
jeroen3 2:6013f6d867e5 220 /* Exceeded pool boundaries */
jeroen3 2:6013f6d867e5 221 /* Calculate overshoot (startpool - indexptr) and subtract from end */
jeroen3 2:6013f6d867e5 222 /* Since one element of overshoot results in end - 1 you would miss the last value */
jeroen3 2:6013f6d867e5 223 ptemp = (endpool+1) - (startpool - ptemp);
jeroen3 2:6013f6d867e5 224 }
jeroen3 2:6013f6d867e5 225 /* Read most recent */
jeroen3 2:6013f6d867e5 226 return *ptemp;
jeroen3 2:6013f6d867e5 227 }
jeroen3 2:6013f6d867e5 228
jeroen3 2:6013f6d867e5 229 /**
jeroen3 2:6013f6d867e5 230 * @brief Pop (lr) least recent from buffer (fifo)
jeroen3 2:6013f6d867e5 231 *
jeroen3 2:6013f6d867e5 232 * @note Buffer state will be altered
jeroen3 2:6013f6d867e5 233 *
jeroen3 2:6013f6d867e5 234 * @warning Consider this opertaion as atomic!
jeroen3 2:6013f6d867e5 235 *
jeroen3 2:6013f6d867e5 236 * @details Read and remove the least recently added from the buffer.
jeroen3 2:6013f6d867e5 237 * Using this results in a fifo type of buffer.
jeroen3 2:6013f6d867e5 238 *
jeroen3 2:6013f6d867e5 239 * @param[in] c Pointer to @p xifo_SIZETYPE_t used for configuration.
jeroen3 2:6013f6d867e5 240 *
jeroen3 2:6013f6d867e5 241 * @return Contents of element or 0 if failed (element can hold 0)
jeroen3 2:6013f6d867e5 242 */
jeroen3 2:6013f6d867e5 243 xifo_dtype pop_lr()
jeroen3 2:6013f6d867e5 244 {
jeroen3 2:6013f6d867e5 245 register xifo_dtype *ptemp;
jeroen3 2:6013f6d867e5 246 xifo_dtype temp;
jeroen3 2:6013f6d867e5 247 /* Verify there is valid data read */
jeroen3 2:6013f6d867e5 248 if(icount == 0){
jeroen3 2:6013f6d867e5 249 return 0;
jeroen3 2:6013f6d867e5 250 }
jeroen3 2:6013f6d867e5 251 /* Derive least recent buffer element */
jeroen3 2:6013f6d867e5 252 ptemp = read+1 - icount;
jeroen3 2:6013f6d867e5 253 /* Validate pointer */
jeroen3 2:6013f6d867e5 254 if(ptemp < startpool){
jeroen3 2:6013f6d867e5 255 /* Exceeded pool boundaries */
jeroen3 2:6013f6d867e5 256 /* Calculate overshoot (startpool - indexptr) and subtract from end */
jeroen3 2:6013f6d867e5 257 /* Since one element of overshoot results in end - 1 you would miss the last value */
jeroen3 2:6013f6d867e5 258 ptemp = (endpool+1) - (startpool - ptemp);
jeroen3 2:6013f6d867e5 259 }
jeroen3 2:6013f6d867e5 260 /* Read oldest buffer element */
jeroen3 2:6013f6d867e5 261 /* Read to temp register */
jeroen3 2:6013f6d867e5 262 temp = *ptemp;
jeroen3 2:6013f6d867e5 263 /* Empty buffer element */
jeroen3 2:6013f6d867e5 264 *ptemp = 0;
jeroen3 2:6013f6d867e5 265 /* Reduce count */
jeroen3 2:6013f6d867e5 266 icount--;
jeroen3 2:6013f6d867e5 267 /* Check full flag */
jeroen3 2:6013f6d867e5 268 if(icount < isize)
jeroen3 2:6013f6d867e5 269 ifull = 0;
jeroen3 2:6013f6d867e5 270 return temp;
jeroen3 2:6013f6d867e5 271 }
jeroen3 2:6013f6d867e5 272
jeroen3 2:6013f6d867e5 273 /**
jeroen3 2:6013f6d867e5 274 * @brief Read from buffer (mr) Most Recent oriented (filo)
jeroen3 2:6013f6d867e5 275 *
jeroen3 2:6013f6d867e5 276 * @note Buffer state will be preserved
jeroen3 2:6013f6d867e5 277 *
jeroen3 2:6013f6d867e5 278 * @warning Consider this opertaion as atomic!
jeroen3 2:6013f6d867e5 279 *
jeroen3 2:6013f6d867e5 280 * @details Read n elements back in time.
jeroen3 2:6013f6d867e5 281 * As for index[0] the most recently added element is returned.
jeroen3 2:6013f6d867e5 282 * And for index[count] the oldest element is returned.
jeroen3 2:6013f6d867e5 283 * This makes it possible to keep history. For DSP application.
jeroen3 2:6013f6d867e5 284 *
jeroen3 2:6013f6d867e5 285 * @param[in] c Pointer to @p xifo_SIZETYPE_t used for configuration.
jeroen3 2:6013f6d867e5 286 * @param[in] index Index relative from most recent
jeroen3 2:6013f6d867e5 287 *
jeroen3 2:6013f6d867e5 288 * @return Contents of element or 0 if failed (element can hold 0)
jeroen3 2:6013f6d867e5 289 */
jeroen3 2:6013f6d867e5 290 xifo_dtype read_mr(uint32_t index)
jeroen3 2:6013f6d867e5 291 {
jeroen3 2:6013f6d867e5 292 register xifo_dtype *ptemp;
jeroen3 2:6013f6d867e5 293 /* Verify there is valid data to read */
jeroen3 2:6013f6d867e5 294 if(index+1 > icount){
jeroen3 2:6013f6d867e5 295 return 0;
jeroen3 2:6013f6d867e5 296 }
jeroen3 2:6013f6d867e5 297 /* Set pointer */
jeroen3 2:6013f6d867e5 298 ptemp = read - index;
jeroen3 2:6013f6d867e5 299 /* Validate pointer */
jeroen3 2:6013f6d867e5 300 if(ptemp < startpool){
jeroen3 2:6013f6d867e5 301 /* Exceeded pool boundaries */
jeroen3 2:6013f6d867e5 302 /* Calculate overshoot (startpool - indexptr) and subtract from end */
jeroen3 2:6013f6d867e5 303 /* Since one element of overshoot results in end - 1 you would miss the last value */
jeroen3 2:6013f6d867e5 304 ptemp = (endpool+1) - (startpool - ptemp);
jeroen3 2:6013f6d867e5 305 }
jeroen3 2:6013f6d867e5 306 /* Read most recent */
jeroen3 2:6013f6d867e5 307 return *ptemp;
jeroen3 2:6013f6d867e5 308 }
jeroen3 2:6013f6d867e5 309
jeroen3 2:6013f6d867e5 310 /**
jeroen3 2:6013f6d867e5 311 * @brief Pop (mr) most recent from buffer (filo)
jeroen3 2:6013f6d867e5 312 *
jeroen3 2:6013f6d867e5 313 * @note Buffer state will be altered
jeroen3 2:6013f6d867e5 314 *
jeroen3 2:6013f6d867e5 315 * @warning Consider this opertaion as atomic!
jeroen3 2:6013f6d867e5 316 *
jeroen3 2:6013f6d867e5 317 * @details Read and remove the most recently added from the buffer.
jeroen3 2:6013f6d867e5 318 * Using this results in a stack type of buffer.
jeroen3 2:6013f6d867e5 319 *
jeroen3 2:6013f6d867e5 320 * @param[in] c Pointer to @p xifo_SIZETYPE_t used for configuration.
jeroen3 2:6013f6d867e5 321 *
jeroen3 2:6013f6d867e5 322 * @return Contents of element or 0 if failed (element can hold 0)
jeroen3 2:6013f6d867e5 323 */
jeroen3 2:6013f6d867e5 324 xifo_dtype pop_mr()
jeroen3 2:6013f6d867e5 325 {
jeroen3 2:6013f6d867e5 326 register xifo_dtype temp;
jeroen3 2:6013f6d867e5 327 /* Verify there is valid data read */
jeroen3 2:6013f6d867e5 328 if(icount == 0){
jeroen3 2:6013f6d867e5 329 return 0;
jeroen3 2:6013f6d867e5 330 }
jeroen3 2:6013f6d867e5 331 /* Read */
jeroen3 2:6013f6d867e5 332 temp = *read;
jeroen3 2:6013f6d867e5 333 /* Empty */
jeroen3 2:6013f6d867e5 334 *read = 0;
jeroen3 2:6013f6d867e5 335 /* Most recent element read, return write pointer */
jeroen3 2:6013f6d867e5 336 pwrite = read;
jeroen3 2:6013f6d867e5 337 /* Decrement read pointer */
jeroen3 2:6013f6d867e5 338 read--;
jeroen3 2:6013f6d867e5 339 /* Validate pointer */
jeroen3 2:6013f6d867e5 340 if( read < startpool ){
jeroen3 2:6013f6d867e5 341 /* Exceeded pool boundaries */
jeroen3 2:6013f6d867e5 342 read = endpool;
jeroen3 2:6013f6d867e5 343 }
jeroen3 2:6013f6d867e5 344 /* Reduce count */
jeroen3 2:6013f6d867e5 345 icount--;
jeroen3 2:6013f6d867e5 346 if(icount < isize)
jeroen3 2:6013f6d867e5 347 ifull = 0;
jeroen3 2:6013f6d867e5 348 return temp;
jeroen3 2:6013f6d867e5 349 }
jeroen3 2:6013f6d867e5 350
jeroen3 2:6013f6d867e5 351 /* Extractors */
jeroen3 2:6013f6d867e5 352 uint32_t size(){ return isize; } /**< @brief Get buffer size */
jeroen3 2:6013f6d867e5 353 uint32_t used(){ return icount; } /**< @brief Get number of used elements */
jeroen3 2:6013f6d867e5 354 uint32_t full(){ return ifull; } /**< @brief Get full flag */
jeroen3 2:6013f6d867e5 355 uint32_t free(){ return isize-icount; } /**< @brief Get number of free elements */
jeroen3 2:6013f6d867e5 356 private:
jeroen3 2:6013f6d867e5 357 bool dynamic;
jeroen3 2:6013f6d867e5 358 xifo_dtype *startpool; /**< @brief First element in pool */
jeroen3 2:6013f6d867e5 359 xifo_dtype *endpool; /**< @brief Last element in pool */
jeroen3 2:6013f6d867e5 360 xifo_dtype *read; /**< @brief Read pointer */
jeroen3 2:6013f6d867e5 361 xifo_dtype *pwrite; /**< @brief Write pointer */
jeroen3 2:6013f6d867e5 362 /* Variables: */
jeroen3 2:6013f6d867e5 363 uint32_t ifull; /**< @brief Flag indicating buffer is full */
jeroen3 2:6013f6d867e5 364 uint32_t icount; /**< @brief Number of elements used */
jeroen3 2:6013f6d867e5 365 uint32_t isize; /**< @brief Size of buffer */
jeroen3 2:6013f6d867e5 366 };
jeroen3 2:6013f6d867e5 367 #endif
jeroen3 2:6013f6d867e5 368
jeroen3 2:6013f6d867e5 369 #if xIFO_USE_64BIT == TRUE
jeroen3 0:a04dc0c57d20 370 /**
jeroen3 0:a04dc0c57d20 371 * @brief Circular Buffer object.
jeroen3 0:a04dc0c57d20 372 * @details This struct holds the object of a circular buffer
jeroen3 0:a04dc0c57d20 373 */
jeroen3 0:a04dc0c57d20 374 typedef struct {
jeroen3 2:6013f6d867e5 375 /* Pointers: */
jeroen3 2:6013f6d867e5 376 uint64_t *startpool; /**< @brief First element in pool */
jeroen3 2:6013f6d867e5 377 uint64_t *endpool; /**< @brief Last element in pool */
jeroen3 2:6013f6d867e5 378 uint64_t *read; /**< @brief Read pointer */
jeroen3 2:6013f6d867e5 379 uint64_t *write; /**< @brief Write pointer */
jeroen3 2:6013f6d867e5 380 /* Variables: */
jeroen3 2:6013f6d867e5 381 uint32_t full; /**< @brief Flag indicating buffer is full */
jeroen3 2:6013f6d867e5 382 uint32_t count; /**< @brief Number of elements used */
jeroen3 2:6013f6d867e5 383 uint32_t size; /**< @brief Size of buffer */
jeroen3 2:6013f6d867e5 384 }xifo64_t;
jeroen3 2:6013f6d867e5 385
jeroen3 2:6013f6d867e5 386 /**< @brief Circular Buffer memory pool type. */
jeroen3 2:6013f6d867e5 387 typedef uint64_t xifo64_pool_t;
jeroen3 0:a04dc0c57d20 388
jeroen3 2:6013f6d867e5 389 #ifdef __cplusplus
jeroen3 2:6013f6d867e5 390 extern "C" {
jeroen3 2:6013f6d867e5 391 #endif
jeroen3 2:6013f6d867e5 392 /* xifo Common */
jeroen3 2:6013f6d867e5 393 void xifo64_init( xifo64_t *c, uint32_t size, uint64_t *startpool );
jeroen3 2:6013f6d867e5 394 void xifo64_clear( xifo64_t *c );
jeroen3 2:6013f6d867e5 395 uint32_t xifo64_write( xifo64_t *c, uint64_t data );
jeroen3 2:6013f6d867e5 396 /* FIFO use */
jeroen3 2:6013f6d867e5 397 uint64_t xifo64_read_lr( xifo64_t *c, uint32_t index );
jeroen3 2:6013f6d867e5 398 uint64_t xifo64_pop_lr( xifo64_t *c );
jeroen3 2:6013f6d867e5 399 /* LIFO use */
jeroen3 2:6013f6d867e5 400 uint64_t xifo64_read_mr( xifo64_t *c, uint32_t index );
jeroen3 2:6013f6d867e5 401 uint64_t xifo64_pop_mr( xifo64_t *c );
jeroen3 2:6013f6d867e5 402 /* Extractors */
jeroen3 2:6013f6d867e5 403 uint32_t xifo64_get_size( xifo64_t *c );
jeroen3 2:6013f6d867e5 404 uint32_t xifo64_get_used( xifo64_t *c );
jeroen3 2:6013f6d867e5 405 uint32_t xifo64_get_full( xifo64_t *c );
jeroen3 2:6013f6d867e5 406 uint32_t xifo64_get_free( xifo64_t *c );
jeroen3 2:6013f6d867e5 407 #ifdef __cplusplus
jeroen3 2:6013f6d867e5 408 }
jeroen3 2:6013f6d867e5 409 #endif
jeroen3 2:6013f6d867e5 410 #endif
jeroen3 2:6013f6d867e5 411
jeroen3 2:6013f6d867e5 412 #if xIFO_USE_32BIT == TRUE
jeroen3 0:a04dc0c57d20 413 /**
jeroen3 2:6013f6d867e5 414 * @brief Circular Buffer object.
jeroen3 2:6013f6d867e5 415 * @details This struct holds the object of a circular buffer
jeroen3 0:a04dc0c57d20 416 */
jeroen3 2:6013f6d867e5 417 typedef struct {
jeroen3 2:6013f6d867e5 418 /* Pointers: */
jeroen3 2:6013f6d867e5 419 uint32_t *startpool; /**< @brief First element in pool */
jeroen3 2:6013f6d867e5 420 uint32_t *endpool; /**< @brief Last element in pool */
jeroen3 2:6013f6d867e5 421 uint32_t *read; /**< @brief Read pointer */
jeroen3 2:6013f6d867e5 422 uint32_t *write; /**< @brief Write pointer */
jeroen3 2:6013f6d867e5 423 /* Variables: */
jeroen3 2:6013f6d867e5 424 uint32_t full; /**< @brief Flag indicating buffer is full */
jeroen3 2:6013f6d867e5 425 uint32_t count; /**< @brief Number of elements used */
jeroen3 2:6013f6d867e5 426 uint32_t size; /**< @brief Size of buffer */
jeroen3 2:6013f6d867e5 427 }xifo32_t;
jeroen3 2:6013f6d867e5 428
jeroen3 2:6013f6d867e5 429 /**< @brief Circular Buffer memory pool type. */
jeroen3 2:6013f6d867e5 430 typedef uint32_t xifo32_pool_t;
jeroen3 0:a04dc0c57d20 431
jeroen3 0:a04dc0c57d20 432 #ifdef __cplusplus
jeroen3 0:a04dc0c57d20 433 extern "C" {
jeroen3 0:a04dc0c57d20 434 #endif
jeroen3 0:a04dc0c57d20 435 /* xifo Common */
jeroen3 2:6013f6d867e5 436 void xifo32_init( xifo32_t *c, uint32_t size, uint32_t *startpool );
jeroen3 2:6013f6d867e5 437 void xifo32_clear( xifo32_t *c );
jeroen3 2:6013f6d867e5 438 uint32_t xifo32_write( xifo32_t *c, uint32_t data );
jeroen3 0:a04dc0c57d20 439 /* FIFO use */
jeroen3 2:6013f6d867e5 440 uint32_t xifo32_read_lr( xifo32_t *c, uint32_t index );
jeroen3 2:6013f6d867e5 441 uint32_t xifo32_pop_lr( xifo32_t *c );
jeroen3 0:a04dc0c57d20 442 /* LIFO use */
jeroen3 2:6013f6d867e5 443 uint32_t xifo32_read_mr( xifo32_t *c, uint32_t index );
jeroen3 2:6013f6d867e5 444 uint32_t xifo32_pop_mr( xifo32_t *c );
jeroen3 0:a04dc0c57d20 445 /* Extractors */
jeroen3 2:6013f6d867e5 446 uint32_t xifo32_get_size( xifo32_t *c );
jeroen3 2:6013f6d867e5 447 uint32_t xifo32_get_used( xifo32_t *c );
jeroen3 2:6013f6d867e5 448 uint32_t xifo32_get_full( xifo32_t *c );
jeroen3 2:6013f6d867e5 449 uint32_t xifo32_get_free( xifo32_t *c );
jeroen3 0:a04dc0c57d20 450 #ifdef __cplusplus
jeroen3 0:a04dc0c57d20 451 }
jeroen3 0:a04dc0c57d20 452 #endif
jeroen3 2:6013f6d867e5 453 #endif
jeroen3 2:6013f6d867e5 454
jeroen3 2:6013f6d867e5 455 #if xIFO_USE_16BIT == TRUE
jeroen3 2:6013f6d867e5 456 /**
jeroen3 2:6013f6d867e5 457 * @brief Circular Buffer object.
jeroen3 2:6013f6d867e5 458 * @details This struct holds the object of a circular buffer
jeroen3 2:6013f6d867e5 459 */
jeroen3 2:6013f6d867e5 460 typedef struct {
jeroen3 2:6013f6d867e5 461 /* Pointers: */
jeroen3 2:6013f6d867e5 462 uint16_t *startpool; /**< @brief First element in pool */
jeroen3 2:6013f6d867e5 463 uint16_t *endpool; /**< @brief Last element in pool */
jeroen3 2:6013f6d867e5 464 uint16_t *read; /**< @brief Read pointer */
jeroen3 2:6013f6d867e5 465 uint16_t *write; /**< @brief Write pointer */
jeroen3 2:6013f6d867e5 466 /* Variables: */
jeroen3 2:6013f6d867e5 467 uint32_t full; /**< @brief Flag indicating buffer is full */
jeroen3 2:6013f6d867e5 468 uint32_t count; /**< @brief Number of elements used */
jeroen3 2:6013f6d867e5 469 uint32_t size; /**< @brief Size of buffer */
jeroen3 2:6013f6d867e5 470 }xifo16_t;
jeroen3 2:6013f6d867e5 471
jeroen3 2:6013f6d867e5 472 /**
jeroen3 2:6013f6d867e5 473 * @brief Circular Buffer memory pool type.
jeroen3 2:6013f6d867e5 474 */
jeroen3 2:6013f6d867e5 475 typedef uint16_t xifo16_pool_t;
jeroen3 2:6013f6d867e5 476
jeroen3 2:6013f6d867e5 477 #ifdef __cplusplus
jeroen3 2:6013f6d867e5 478 extern "C" {
jeroen3 2:6013f6d867e5 479 #endif
jeroen3 2:6013f6d867e5 480 /* xifo Common */
jeroen3 2:6013f6d867e5 481 void xifo16_init( xifo16_t *c, uint32_t size, uint16_t *startpool);
jeroen3 2:6013f6d867e5 482 void xifo16_clear( xifo16_t *c);
jeroen3 2:6013f6d867e5 483 uint32_t xifo16_write( xifo16_t *c, uint16_t data);
jeroen3 2:6013f6d867e5 484 /* FIFO use */
jeroen3 2:6013f6d867e5 485 uint16_t xifo16_read_lr( xifo16_t *c, uint32_t index);
jeroen3 2:6013f6d867e5 486 uint16_t xifo16_pop_lr( xifo16_t *c);
jeroen3 2:6013f6d867e5 487 /* LIFO use */
jeroen3 2:6013f6d867e5 488 uint16_t xifo16_read_mr( xifo16_t *c, uint32_t index);
jeroen3 2:6013f6d867e5 489 uint16_t xifo16_pop_mr( xifo16_t *c);
jeroen3 2:6013f6d867e5 490 /* Extractors */
jeroen3 2:6013f6d867e5 491 uint32_t xifo16_get_size( xifo16_t *c);
jeroen3 2:6013f6d867e5 492 uint32_t xifo16_get_used( xifo16_t *c);
jeroen3 2:6013f6d867e5 493 uint32_t xifo16_get_full( xifo16_t *c);
jeroen3 2:6013f6d867e5 494 uint32_t xifo16_get_free( xifo16_t *c);
jeroen3 2:6013f6d867e5 495 #ifdef __cplusplus
jeroen3 2:6013f6d867e5 496 }
jeroen3 2:6013f6d867e5 497 #endif
jeroen3 2:6013f6d867e5 498 #endif
jeroen3 2:6013f6d867e5 499
jeroen3 2:6013f6d867e5 500 #if xIFO_USE_8BIT == TRUE
jeroen3 2:6013f6d867e5 501 /**
jeroen3 2:6013f6d867e5 502 * @brief Circular Buffer object.
jeroen3 2:6013f6d867e5 503 * @details This struct holds the object of a circular buffer
jeroen3 2:6013f6d867e5 504 */
jeroen3 2:6013f6d867e5 505 typedef struct {
jeroen3 2:6013f6d867e5 506 /* Pointers: */
jeroen3 2:6013f6d867e5 507 uint8_t *startpool; /**< @brief First element in pool */
jeroen3 2:6013f6d867e5 508 uint8_t *endpool; /**< @brief Last element in pool */
jeroen3 2:6013f6d867e5 509 uint8_t *read; /**< @brief Read pointer */
jeroen3 2:6013f6d867e5 510 uint8_t *write; /**< @brief Write pointer */
jeroen3 2:6013f6d867e5 511 /* Variables: */
jeroen3 2:6013f6d867e5 512 uint32_t full; /**< @brief Flag indicating buffer is full */
jeroen3 2:6013f6d867e5 513 uint32_t count; /**< @brief Number of elements used */
jeroen3 2:6013f6d867e5 514 uint32_t size; /**< @brief Size of buffer */
jeroen3 2:6013f6d867e5 515 }xifo8_t;
jeroen3 2:6013f6d867e5 516
jeroen3 2:6013f6d867e5 517 /**< @brief Circular Buffer memory pool type. */
jeroen3 2:6013f6d867e5 518 typedef uint8_t xifo8_pool_t;
jeroen3 2:6013f6d867e5 519
jeroen3 2:6013f6d867e5 520 #ifdef __cplusplus
jeroen3 2:6013f6d867e5 521 extern "C" {
jeroen3 2:6013f6d867e5 522 #endif
jeroen3 2:6013f6d867e5 523 /* xifo Common */
jeroen3 2:6013f6d867e5 524 void xifo8_init(xifo8_t *c, uint32_t size, uint8_t *startpool );
jeroen3 2:6013f6d867e5 525 void xifo8_clear( xifo8_t *c );
jeroen3 2:6013f6d867e5 526 uint32_t xifo8_write( xifo8_t *c, uint8_t data );
jeroen3 2:6013f6d867e5 527 /* FIFO use */
jeroen3 2:6013f6d867e5 528 uint8_t xifo8_read_lr( xifo8_t *c, uint32_t index );
jeroen3 2:6013f6d867e5 529 uint8_t xifo8_pop_lr( xifo8_t *c );
jeroen3 2:6013f6d867e5 530 /* LIFO use */
jeroen3 2:6013f6d867e5 531 uint8_t xifo8_read_mr( xifo8_t *c, uint32_t index );
jeroen3 2:6013f6d867e5 532 uint8_t xifo8_pop_mr( xifo8_t *c );
jeroen3 2:6013f6d867e5 533 /* Extractors */
jeroen3 2:6013f6d867e5 534 uint32_t xifo8_get_size( xifo8_t *c );
jeroen3 2:6013f6d867e5 535 uint32_t xifo8_get_used( xifo8_t *c );
jeroen3 2:6013f6d867e5 536 uint32_t xifo8_get_full( xifo8_t *c );
jeroen3 2:6013f6d867e5 537 uint32_t xifo8_get_free( xifo8_t *c );
jeroen3 2:6013f6d867e5 538 #ifdef __cplusplus
jeroen3 2:6013f6d867e5 539 }
jeroen3 2:6013f6d867e5 540 #endif
jeroen3 2:6013f6d867e5 541 #endif
jeroen3 2:6013f6d867e5 542
jeroen3 0:a04dc0c57d20 543 #endif //_xifo_H_
jeroen3 0:a04dc0c57d20 544
jeroen3 0:a04dc0c57d20 545 /** @} */