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@2:6013f6d867e5, 2014-04-04 (annotated)
- 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?
User | Revision | Line number | New 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 | /** @} */ |