ring buffer
rbuf.c@8:40af324896d9, 2012-02-28 (annotated)
- Committer:
- est2fe
- Date:
- Tue Feb 28 19:57:07 2012 +0000
- Revision:
- 8:40af324896d9
- Parent:
- 7:5e960f7b1f79
0.xy2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
est2fe | 4:192672304400 | 1 | #ifndef __rbuf_c_ |
est2fe | 4:192672304400 | 2 | #define __rbuf_c_ |
est2fe | 0:eae8cffdd121 | 3 | |
est2fe | 0:eae8cffdd121 | 4 | #include "mbed.h" |
est2fe | 0:eae8cffdd121 | 5 | #include "rbuf.h" |
est2fe | 0:eae8cffdd121 | 6 | |
est2fe | 4:192672304400 | 7 | void init_header (rbuf_t *h, void *buf, uint16_t objektanzahl, uint16_t Schwelle, uint16_t objektgroesse) |
est2fe | 0:eae8cffdd121 | 8 | { |
est2fe | 0:eae8cffdd121 | 9 | h->buflen = objektanzahl; |
est2fe | 0:eae8cffdd121 | 10 | h->bufcnt = 0; |
est2fe | 0:eae8cffdd121 | 11 | h->in = buf; |
est2fe | 0:eae8cffdd121 | 12 | h->out = buf; |
est2fe | 0:eae8cffdd121 | 13 | h->buf = buf; |
est2fe | 0:eae8cffdd121 | 14 | h->anzahl = 0; |
est2fe | 0:eae8cffdd121 | 15 | h->fehleranzahl = 0; |
est2fe | 0:eae8cffdd121 | 16 | h->Schwelle = Schwelle; |
est2fe | 0:eae8cffdd121 | 17 | h->flags = 0; |
est2fe | 0:eae8cffdd121 | 18 | h->peak_max = 0; |
est2fe | 0:eae8cffdd121 | 19 | h->blockgroesse = objektgroesse; |
est2fe | 0:eae8cffdd121 | 20 | } |
est2fe | 0:eae8cffdd121 | 21 | |
est2fe | 4:192672304400 | 22 | rbuf_t *rbuf_init (uint16_t b_size, uint16_t b_schwelle, uint16_t blockgroesse) |
est2fe | 0:eae8cffdd121 | 23 | { |
est2fe | 4:192672304400 | 24 | void *buffer_p; |
est2fe | 4:192672304400 | 25 | rbuf_t *kopf_p; |
est2fe | 0:eae8cffdd121 | 26 | |
est2fe | 0:eae8cffdd121 | 27 | // Zuerst mal Speicher fuer die Verwaltungsstruktur holen |
est2fe | 4:192672304400 | 28 | kopf_p = (rbuf_t *) calloc (1, (sizeof(rbuf_t))); |
est2fe | 0:eae8cffdd121 | 29 | if (kopf_p > 0x00) |
est2fe | 0:eae8cffdd121 | 30 | { |
est2fe | 4:192672304400 | 31 | memset (kopf_p, 0x00, (sizeof(rbuf_t))); |
est2fe | 0:eae8cffdd121 | 32 | } |
est2fe | 0:eae8cffdd121 | 33 | else |
est2fe | 0:eae8cffdd121 | 34 | { |
est2fe | 0:eae8cffdd121 | 35 | return 0x00; |
est2fe | 0:eae8cffdd121 | 36 | } |
est2fe | 0:eae8cffdd121 | 37 | |
est2fe | 0:eae8cffdd121 | 38 | // Jetzt noch die eigentlichen Receive- und send-char-Speicher |
est2fe | 0:eae8cffdd121 | 39 | size_t blen = b_size * blockgroesse; |
est2fe | 0:eae8cffdd121 | 40 | buffer_p = calloc (1, blen); |
est2fe | 0:eae8cffdd121 | 41 | if (buffer_p > 0x00) |
est2fe | 0:eae8cffdd121 | 42 | { |
est2fe | 0:eae8cffdd121 | 43 | memset (buffer_p, 0x00, blen); |
est2fe | 0:eae8cffdd121 | 44 | } |
est2fe | 0:eae8cffdd121 | 45 | else |
est2fe | 0:eae8cffdd121 | 46 | { |
est2fe | 4:192672304400 | 47 | // gibt es noch nichts! -> evtl. Fehlemeldung, dass nicht mehr genuegend Speicher vorhanden ist. |
est2fe | 0:eae8cffdd121 | 48 | return 0x00; |
est2fe | 0:eae8cffdd121 | 49 | } |
est2fe | 0:eae8cffdd121 | 50 | |
est2fe | 5:ddc33cb62d27 | 51 | // Und die Buffer-Verwaltung noch initialisieren |
est2fe | 0:eae8cffdd121 | 52 | init_header (kopf_p, buffer_p, b_size, b_schwelle, blockgroesse); |
est2fe | 0:eae8cffdd121 | 53 | return kopf_p; |
est2fe | 0:eae8cffdd121 | 54 | } |
est2fe | 0:eae8cffdd121 | 55 | |
est2fe | 4:192672304400 | 56 | void *rbuf_look (rbuf_t * r) // Nur schauen, ob im Buffer neue Ojekte drin sind. |
est2fe | 0:eae8cffdd121 | 57 | { |
est2fe | 4:192672304400 | 58 | // return r->bufcnt; |
est2fe | 0:eae8cffdd121 | 59 | if (r->bufcnt == 0) |
est2fe | 0:eae8cffdd121 | 60 | { |
est2fe | 0:eae8cffdd121 | 61 | return 0; |
est2fe | 0:eae8cffdd121 | 62 | } |
est2fe | 0:eae8cffdd121 | 63 | else |
est2fe | 0:eae8cffdd121 | 64 | { |
est2fe | 0:eae8cffdd121 | 65 | return r->out; // ?!? |
est2fe | 0:eae8cffdd121 | 66 | } |
est2fe | 0:eae8cffdd121 | 67 | } |
est2fe | 0:eae8cffdd121 | 68 | |
est2fe | 4:192672304400 | 69 | void *rbuf_get (rbuf_t *r, void *target) // Einen char/Block rausholen mit Readzeiger++ |
est2fe | 0:eae8cffdd121 | 70 | { |
est2fe | 7:5e960f7b1f79 | 71 | void *p_b = r->out; // Pointer block |
est2fe | 0:eae8cffdd121 | 72 | if (r->bufcnt == 0) |
est2fe | 0:eae8cffdd121 | 73 | { |
est2fe | 0:eae8cffdd121 | 74 | r->flags = r->flags & ((uint8_t) (~NOT_EMPTY)); |
est2fe | 0:eae8cffdd121 | 75 | return 0; |
est2fe | 0:eae8cffdd121 | 76 | } |
est2fe | 7:5e960f7b1f79 | 77 | __disable_irq(); // Disable Interrupts |
est2fe | 4:192672304400 | 78 | r->bufcnt--; // Ein Objekt weniger im Buffer |
est2fe | 8:40af324896d9 | 79 | __enable_irq(); // Enable Interrupts |
est2fe | 7:5e960f7b1f79 | 80 | p_b = (void *) (((char *) p_b) + r->blockgroesse ); |
est2fe | 0:eae8cffdd121 | 81 | if (r->bufcnt >= r->Schwelle) |
est2fe | 0:eae8cffdd121 | 82 | { |
est2fe | 0:eae8cffdd121 | 83 | r->flags = r->flags | ((uint8_t) (FAST_VOLL)); |
est2fe | 0:eae8cffdd121 | 84 | } |
est2fe | 0:eae8cffdd121 | 85 | else |
est2fe | 0:eae8cffdd121 | 86 | { |
est2fe | 0:eae8cffdd121 | 87 | r->flags = r->flags & ((uint8_t) (~FAST_VOLL)); |
est2fe | 0:eae8cffdd121 | 88 | } |
est2fe | 0:eae8cffdd121 | 89 | if (r->bufcnt == 0) |
est2fe | 0:eae8cffdd121 | 90 | { |
est2fe | 0:eae8cffdd121 | 91 | r->flags = r->flags & ((uint8_t) (~NOT_EMPTY)); |
est2fe | 0:eae8cffdd121 | 92 | } |
est2fe | 7:5e960f7b1f79 | 93 | memcpy (target, r->out, r->blockgroesse); |
est2fe | 0:eae8cffdd121 | 94 | |
est2fe | 0:eae8cffdd121 | 95 | // (1 - 8) |
est2fe | 0:eae8cffdd121 | 96 | // if (r->out >= r->buf + (r->buflen)) // ?? Hier ist die Zeigerarithmetik noch unklar! |
est2fe | 7:5e960f7b1f79 | 97 | if (p_b >= (void *)(((char *)(r->buf)) + (r->buflen * r->blockgroesse))) // ?? Hier ist die Zeigerarithmetik noch unklar! |
est2fe | 0:eae8cffdd121 | 98 | { |
est2fe | 0:eae8cffdd121 | 99 | // wrap around to beginning |
est2fe | 7:5e960f7b1f79 | 100 | p_b = r->buf; |
est2fe | 0:eae8cffdd121 | 101 | } |
est2fe | 7:5e960f7b1f79 | 102 | r->out = p_b; |
est2fe | 0:eae8cffdd121 | 103 | return p_b; // ?!? |
est2fe | 0:eae8cffdd121 | 104 | } |
est2fe | 0:eae8cffdd121 | 105 | |
est2fe | 4:192672304400 | 106 | void *rbuf_put (rbuf_t *r, void *b_p) // Ein Zeichen/Block einstellen |
est2fe | 0:eae8cffdd121 | 107 | { |
est2fe | 7:5e960f7b1f79 | 108 | void *p_alt = r->in; |
est2fe | 7:5e960f7b1f79 | 109 | void *p_neu = p_alt; |
est2fe | 7:5e960f7b1f79 | 110 | int cnt = r->bufcnt; |
est2fe | 7:5e960f7b1f79 | 111 | if (cnt >= r->buflen) |
est2fe | 0:eae8cffdd121 | 112 | { |
est2fe | 0:eae8cffdd121 | 113 | r->fehleranzahl++; |
est2fe | 0:eae8cffdd121 | 114 | r->flags = r->flags | ((uint8_t) (FEHLER)); |
est2fe | 0:eae8cffdd121 | 115 | return 0; // Wenn Buffer voll dann mit Nullpointer zurueck |
est2fe | 0:eae8cffdd121 | 116 | } |
est2fe | 7:5e960f7b1f79 | 117 | memcpy (p_alt, b_p, r->blockgroesse); |
est2fe | 7:5e960f7b1f79 | 118 | cnt++; |
est2fe | 7:5e960f7b1f79 | 119 | if ((cnt) > r->peak_max) {r->peak_max = cnt;} |
est2fe | 7:5e960f7b1f79 | 120 | if (cnt >= r->Schwelle) |
est2fe | 0:eae8cffdd121 | 121 | { |
est2fe | 0:eae8cffdd121 | 122 | r->flags = r->flags | ((uint8_t) (FAST_VOLL)); |
est2fe | 0:eae8cffdd121 | 123 | } |
est2fe | 0:eae8cffdd121 | 124 | else |
est2fe | 0:eae8cffdd121 | 125 | { |
est2fe | 0:eae8cffdd121 | 126 | r->flags = r->flags & ((uint8_t) (~FAST_VOLL)); |
est2fe | 0:eae8cffdd121 | 127 | } |
est2fe | 0:eae8cffdd121 | 128 | r->anzahl++; // Anzahl aller Zeichen/Bloecke aufsummiert |
est2fe | 0:eae8cffdd121 | 129 | r->flags = r->flags | ((uint8_t) (NOT_EMPTY)); |
est2fe | 0:eae8cffdd121 | 130 | |
est2fe | 0:eae8cffdd121 | 131 | // r->in++; // Falls er das zuerst machen sollte! |
est2fe | 7:5e960f7b1f79 | 132 | p_neu = (void *) (((char *) p_neu) + r->blockgroesse ); |
est2fe | 7:5e960f7b1f79 | 133 | if (p_neu >= (void *) (((char *)r->buf) + (r->buflen * r->blockgroesse))) |
est2fe | 0:eae8cffdd121 | 134 | { |
est2fe | 0:eae8cffdd121 | 135 | // Bei Zeiger > Buffer, Zeiger wieder an Anfang vom Buffer |
est2fe | 7:5e960f7b1f79 | 136 | p_neu = r->buf; |
est2fe | 0:eae8cffdd121 | 137 | } |
est2fe | 7:5e960f7b1f79 | 138 | r->in = p_neu; |
est2fe | 7:5e960f7b1f79 | 139 | __disable_irq(); // Disable Interrupts |
est2fe | 7:5e960f7b1f79 | 140 | r->bufcnt++; // = cnt; |
est2fe | 8:40af324896d9 | 141 | __enable_irq(); // Enable Interrupts |
est2fe | 7:5e960f7b1f79 | 142 | return p_alt; |
est2fe | 0:eae8cffdd121 | 143 | } |
est2fe | 0:eae8cffdd121 | 144 | |
est2fe | 5:ddc33cb62d27 | 145 | uint32_t rbuf_getcnt (rbuf_t *buffer) |
est2fe | 5:ddc33cb62d27 | 146 | { |
est2fe | 5:ddc33cb62d27 | 147 | return buffer->bufcnt; |
est2fe | 5:ddc33cb62d27 | 148 | } |
est2fe | 5:ddc33cb62d27 | 149 | |
est2fe | 5:ddc33cb62d27 | 150 | uint32_t rbuf_getflags (rbuf_t *buffer) |
est2fe | 5:ddc33cb62d27 | 151 | { |
est2fe | 5:ddc33cb62d27 | 152 | return buffer->flags; |
est2fe | 5:ddc33cb62d27 | 153 | } |
est2fe | 5:ddc33cb62d27 | 154 | |
est2fe | 5:ddc33cb62d27 | 155 | uint32_t rbuf_getfehler (rbuf_t *buffer) |
est2fe | 5:ddc33cb62d27 | 156 | { |
est2fe | 5:ddc33cb62d27 | 157 | return buffer->fehleranzahl; |
est2fe | 5:ddc33cb62d27 | 158 | } |
est2fe | 5:ddc33cb62d27 | 159 | |
est2fe | 5:ddc33cb62d27 | 160 | uint32_t rbuf_leer (rbuf_t *buffer) |
est2fe | 5:ddc33cb62d27 | 161 | { |
est2fe | 5:ddc33cb62d27 | 162 | return !(buffer->flags && NOT_EMPTY); |
est2fe | 5:ddc33cb62d27 | 163 | } |
est2fe | 5:ddc33cb62d27 | 164 | |
est2fe | 5:ddc33cb62d27 | 165 | uint32_t rbuf_fast_voll (rbuf_t *buffer) |
est2fe | 5:ddc33cb62d27 | 166 | { |
est2fe | 5:ddc33cb62d27 | 167 | return (buffer->flags && FAST_VOLL); |
est2fe | 5:ddc33cb62d27 | 168 | } |
est2fe | 5:ddc33cb62d27 | 169 | |
est2fe | 5:ddc33cb62d27 | 170 | uint32_t rbuf_fehler (rbuf_t *buffer) |
est2fe | 5:ddc33cb62d27 | 171 | { |
est2fe | 5:ddc33cb62d27 | 172 | return (buffer->flags && FEHLER); |
est2fe | 5:ddc33cb62d27 | 173 | } |
est2fe | 5:ddc33cb62d27 | 174 | |
est2fe | 5:ddc33cb62d27 | 175 | uint32_t rbuf_getfehleranz (rbuf_t *buffer) |
est2fe | 5:ddc33cb62d27 | 176 | { |
est2fe | 5:ddc33cb62d27 | 177 | return buffer->fehleranzahl; |
est2fe | 5:ddc33cb62d27 | 178 | } |
est2fe | 5:ddc33cb62d27 | 179 | |
est2fe | 5:ddc33cb62d27 | 180 | uint32_t rbuf_get_gesendet (rbuf_t *buffer) |
est2fe | 5:ddc33cb62d27 | 181 | { |
est2fe | 5:ddc33cb62d27 | 182 | return buffer->anzahl; |
est2fe | 5:ddc33cb62d27 | 183 | } |
est2fe | 5:ddc33cb62d27 | 184 | |
est2fe | 5:ddc33cb62d27 | 185 | #endif // von __rbuf_c_ |