ring buffer
rbuf.h@0:eae8cffdd121, 2011-06-23 (annotated)
- Committer:
- est2fe
- Date:
- Thu Jun 23 19:44:23 2011 +0000
- Revision:
- 0:eae8cffdd121
- Child:
- 1:cebd379d1139
V 0.9
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
est2fe | 0:eae8cffdd121 | 1 | #ifndef __ringbuffer_h_ |
est2fe | 0:eae8cffdd121 | 2 | #define __ringbuffer_h_ |
est2fe | 0:eae8cffdd121 | 3 | |
est2fe | 0:eae8cffdd121 | 4 | #include "can.h" |
est2fe | 0:eae8cffdd121 | 5 | |
est2fe | 0:eae8cffdd121 | 6 | #define NOT_EMPTY 0x01 // Bit fuer mindestens 1 Frame im Buffer |
est2fe | 0:eae8cffdd121 | 7 | #define FAST_VOLL 0x02 // Bit fuer Fuellstandsschwelle ueberschritten |
est2fe | 0:eae8cffdd121 | 8 | #define FEHLER 0x04 // Bit fuer Fehler aufgetreten |
est2fe | 0:eae8cffdd121 | 9 | |
est2fe | 0:eae8cffdd121 | 10 | typedef struct |
est2fe | 0:eae8cffdd121 | 11 | { |
est2fe | 0:eae8cffdd121 | 12 | uint16_t buflen; // Max. Objektanzahl fuer den Buffer |
est2fe | 0:eae8cffdd121 | 13 | uint16_t bufcnt; // Bufferfuellstand in Objekten |
est2fe | 0:eae8cffdd121 | 14 | void * in; // Zeiger auf char zum Schreiben (Schreibzeiger) |
est2fe | 0:eae8cffdd121 | 15 | void * out; // Zeiger auf char zum Lesen (Lesezeiger) |
est2fe | 0:eae8cffdd121 | 16 | void * buf; // Zeiger auf char[LEN]-Buffer (Buffer an sich) |
est2fe | 0:eae8cffdd121 | 17 | uint32_t anzahl; // Anzahl aller geschriebenen Elemente (Absolutanzahl Elementz�hler) |
est2fe | 0:eae8cffdd121 | 18 | uint32_t fehleranzahl; // Anzahl aufgetretener Fehler |
est2fe | 0:eae8cffdd121 | 19 | uint16_t Schwelle; // Schwelle fuer "fast voll" |
est2fe | 0:eae8cffdd121 | 20 | uint16_t flags; // Status-Flags |
est2fe | 0:eae8cffdd121 | 21 | uint16_t peak_max; // Schleppzeiger ueber den max. Fuellstand an Elementen |
est2fe | 0:eae8cffdd121 | 22 | uint16_t blockgroesse; // Groesse eines Datenobjekts (1 Byte bis Frames) = Objektgroesse |
est2fe | 0:eae8cffdd121 | 23 | } buffer_header_t; // |
est2fe | 0:eae8cffdd121 | 24 | |
est2fe | 0:eae8cffdd121 | 25 | typedef struct |
est2fe | 0:eae8cffdd121 | 26 | { |
est2fe | 0:eae8cffdd121 | 27 | buffer_header_t in; |
est2fe | 0:eae8cffdd121 | 28 | buffer_header_t out; |
est2fe | 0:eae8cffdd121 | 29 | } io_buf_s; |
est2fe | 0:eae8cffdd121 | 30 | /** |
est2fe | 0:eae8cffdd121 | 31 | |
est2fe | 0:eae8cffdd121 | 32 | typedef struct |
est2fe | 0:eae8cffdd121 | 33 | { |
est2fe | 0:eae8cffdd121 | 34 | uint16_t buflen; // Max. Objektanzahl fuer den Buffer |
est2fe | 0:eae8cffdd121 | 35 | uint16_t bufcnt; // Bufferfuellstand in Objekten |
est2fe | 0:eae8cffdd121 | 36 | void * in; // Zeiger auf char zum Schreiben (Schreibzeiger) |
est2fe | 0:eae8cffdd121 | 37 | void * out; // Zeiger auf char zum Lesen (Lesezeiger) |
est2fe | 0:eae8cffdd121 | 38 | void * buf; // Zeiger auf char[LEN]-Buffer (Buffer an sich) |
est2fe | 0:eae8cffdd121 | 39 | uint32_t anzahl; // Anzahl aller geschriebenen Elemente (Absolutanzahl Elementz�hler) |
est2fe | 0:eae8cffdd121 | 40 | uint32_t fehleranzahl; // Anzahl aufgetretener Fehler |
est2fe | 0:eae8cffdd121 | 41 | uint16_t Schwelle; // Schwelle fuer "fast voll" |
est2fe | 0:eae8cffdd121 | 42 | uint16_t flags; // Status-Flags |
est2fe | 0:eae8cffdd121 | 43 | uint16_t peak_max; // Schleppzeiger ueber den max. Fuellstand an Elementen |
est2fe | 0:eae8cffdd121 | 44 | uint16_t blockgroesse; // Groesse eines Datenobjekts (1 Byte bis Frames) = Objektgroesse |
est2fe | 0:eae8cffdd121 | 45 | } buffer_header_t; // |
est2fe | 0:eae8cffdd121 | 46 | |
est2fe | 0:eae8cffdd121 | 47 | typedef struct |
est2fe | 0:eae8cffdd121 | 48 | { |
est2fe | 0:eae8cffdd121 | 49 | buffer_header_t in; |
est2fe | 0:eae8cffdd121 | 50 | buffer_header_t out; |
est2fe | 0:eae8cffdd121 | 51 | } io_buf_s; |
est2fe | 0:eae8cffdd121 | 52 | |
est2fe | 0:eae8cffdd121 | 53 | |
est2fe | 0:eae8cffdd121 | 54 | */ |
est2fe | 0:eae8cffdd121 | 55 | |
est2fe | 0:eae8cffdd121 | 56 | #define rbuf_t buffer_header_t |
est2fe | 0:eae8cffdd121 | 57 | |
est2fe | 0:eae8cffdd121 | 58 | #define rbuffer_init charbuffer_init |
est2fe | 0:eae8cffdd121 | 59 | #define rbuffer_get charbuffer_get |
est2fe | 0:eae8cffdd121 | 60 | #define rbuffer_put charbuffer_put |
est2fe | 0:eae8cffdd121 | 61 | #define rbuffer_look charbuffer_look |
est2fe | 0:eae8cffdd121 | 62 | |
est2fe | 0:eae8cffdd121 | 63 | #define rbuf_init charbuffer_init |
est2fe | 0:eae8cffdd121 | 64 | #define rbuf_get charbuffer_get |
est2fe | 0:eae8cffdd121 | 65 | #define rbuf_put charbuffer_put |
est2fe | 0:eae8cffdd121 | 66 | #define rbuf_look charbuffer_look |
est2fe | 0:eae8cffdd121 | 67 | #define rbuf_print_header print_verwaltung |
est2fe | 0:eae8cffdd121 | 68 | |
est2fe | 0:eae8cffdd121 | 69 | #define charbuffer_lock charbuffer_readable |
est2fe | 0:eae8cffdd121 | 70 | |
est2fe | 0:eae8cffdd121 | 71 | // create und init von einer doppelten Bufferstruktur, also einen I/O-Buffer |
est2fe | 0:eae8cffdd121 | 72 | io_buf_s *create_charbuffer_io (uint16_t r_size, uint16_t s_size, uint16_t r_schwelle, uint16_t s_schwelle, uint16_t blockgroesse); |
est2fe | 0:eae8cffdd121 | 73 | |
est2fe | 0:eae8cffdd121 | 74 | // create und init einen einzigen Ring-Buffer |
est2fe | 0:eae8cffdd121 | 75 | buffer_header_t *charbuffer_init (uint16_t b_size, uint16_t b_schwelle, uint16_t blockgroesse); |
est2fe | 0:eae8cffdd121 | 76 | |
est2fe | 0:eae8cffdd121 | 77 | void *charbuffer_readable (buffer_header_t *r); // Nur nachschauen, ob ein Frame da ist |
est2fe | 0:eae8cffdd121 | 78 | void *charbuffer_get (buffer_header_t *r, void *target); // Einen char/Block rausholen mit Readzeiger++ |
est2fe | 0:eae8cffdd121 | 79 | char *charbuffer_put (buffer_header_t *r, void *f); // Einen Frame in den Buffer tun mit anzahl++ |
est2fe | 0:eae8cffdd121 | 80 | |
est2fe | 0:eae8cffdd121 | 81 | void charbuffer_copy (void *quelle, void *ziel, uint16_t size); // Quelle -> Ziel kopieren |
est2fe | 0:eae8cffdd121 | 82 | void charbuffer_move (void *quelle, void *ziel, uint16_t size); // Quelle -> Ziel (Move mit anschliessendem loeschen der Quelle) |
est2fe | 0:eae8cffdd121 | 83 | |
est2fe | 0:eae8cffdd121 | 84 | void print_verwaltung (buffer_header_t *rbk_p); |
est2fe | 0:eae8cffdd121 | 85 | void display_rbuffer_header (io_buf_s *rb); |
est2fe | 0:eae8cffdd121 | 86 | |
est2fe | 0:eae8cffdd121 | 87 | |
est2fe | 0:eae8cffdd121 | 88 | /* |
est2fe | 0:eae8cffdd121 | 89 | * Copyright (c) 2002, 2003 Brian S. Dean <bsd@bsdhome.com> |
est2fe | 0:eae8cffdd121 | 90 | * All Rights Reserved. |
est2fe | 0:eae8cffdd121 | 91 | * |
est2fe | 0:eae8cffdd121 | 92 | * Redistribution and use in source and binary forms, with or without |
est2fe | 0:eae8cffdd121 | 93 | * modification, are permitted provided that the following conditions |
est2fe | 0:eae8cffdd121 | 94 | * are met: |
est2fe | 0:eae8cffdd121 | 95 | * |
est2fe | 0:eae8cffdd121 | 96 | * 1. Redistributions of source code must retain the above copyright |
est2fe | 0:eae8cffdd121 | 97 | * notice, this list of conditions and the following disclaimer. |
est2fe | 0:eae8cffdd121 | 98 | * 2. Redistributions in binary form must reproduce the above copyright |
est2fe | 0:eae8cffdd121 | 99 | * notice, this list of conditions and the following disclaimer in the |
est2fe | 0:eae8cffdd121 | 100 | * documentation and/or other materials provided with the distribution. |
est2fe | 0:eae8cffdd121 | 101 | * |
est2fe | 0:eae8cffdd121 | 102 | * THIS SOFTWARE IS PROVIDED BY BRIAN S. DEAN ``AS IS'' AND ANY |
est2fe | 0:eae8cffdd121 | 103 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
est2fe | 0:eae8cffdd121 | 104 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
est2fe | 0:eae8cffdd121 | 105 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BRIAN S. DEAN BE LIABLE |
est2fe | 0:eae8cffdd121 | 106 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
est2fe | 0:eae8cffdd121 | 107 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT |
est2fe | 0:eae8cffdd121 | 108 | * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
est2fe | 0:eae8cffdd121 | 109 | * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
est2fe | 0:eae8cffdd121 | 110 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
est2fe | 0:eae8cffdd121 | 111 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE |
est2fe | 0:eae8cffdd121 | 112 | * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
est2fe | 0:eae8cffdd121 | 113 | * DAMAGE. |
est2fe | 0:eae8cffdd121 | 114 | * |
est2fe | 0:eae8cffdd121 | 115 | * |
est2fe | 0:eae8cffdd121 | 116 | * 20060206 Kschwi: Type change of return parameter from uint8_t to unit16_t |
est2fe | 0:eae8cffdd121 | 117 | * 20060319 Kschwi: ringbuffer_read added (read without remove) |
est2fe | 0:eae8cffdd121 | 118 | * 20070423 Kschwi: ringbuffer becomes voltile |
est2fe | 0:eae8cffdd121 | 119 | * 20070508 est2fe: adjusted to CAN frames |
est2fe | 0:eae8cffdd121 | 120 | * Alles sind nur Zeiger auf CANframe-Buffer |
est2fe | 0:eae8cffdd121 | 121 | * Wenn es geklappt hat dann kommt ein Zeiger <> 0 zurueck |
est2fe | 0:eae8cffdd121 | 122 | * Hat es nicht geklappt, dann kommt ein Null-Pointer zurueck! |
est2fe | 0:eae8cffdd121 | 123 | * Es wird davon ausgegangen, dass im ringbuffer |
est2fe | 0:eae8cffdd121 | 124 | * nicht mehr als 255 Frames Platz haben -> len + cnt als uint_t. |
est2fe | 0:eae8cffdd121 | 125 | * 20110609 est2fe: Umgebaut auf character ringbuffer |
est2fe | 0:eae8cffdd121 | 126 | * |
est2fe | 0:eae8cffdd121 | 127 | * |
est2fe | 0:eae8cffdd121 | 128 | */ |
est2fe | 0:eae8cffdd121 | 129 | |
est2fe | 0:eae8cffdd121 | 130 | |
est2fe | 0:eae8cffdd121 | 131 | #endif |