ring buffer

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?

UserRevisionLine numberNew 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_