ring buffer

Committer:
est2fe
Date:
Thu Jun 23 21:11:06 2011 +0000
Revision:
4:192672304400
Parent:
3:c9c7c8e20336
Child:
5:ddc33cb62d27
V 0.96

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 0:eae8cffdd121 51 // Und die Buffer-Verwaltung noch initialisieren
est2fe 0:eae8cffdd121 52
est2fe 0:eae8cffdd121 53 init_header (kopf_p, buffer_p, b_size, b_schwelle, blockgroesse);
est2fe 0:eae8cffdd121 54 return kopf_p;
est2fe 0:eae8cffdd121 55 }
est2fe 0:eae8cffdd121 56
est2fe 4:192672304400 57 void *rbuf_look (rbuf_t * r) // Nur schauen, ob im Buffer neue Ojekte drin sind.
est2fe 0:eae8cffdd121 58 {
est2fe 4:192672304400 59 // return r->bufcnt;
est2fe 0:eae8cffdd121 60 if (r->bufcnt == 0)
est2fe 0:eae8cffdd121 61 {
est2fe 0:eae8cffdd121 62 return 0;
est2fe 0:eae8cffdd121 63 }
est2fe 0:eae8cffdd121 64 else
est2fe 0:eae8cffdd121 65 {
est2fe 0:eae8cffdd121 66 return r->out; // ?!?
est2fe 0:eae8cffdd121 67 }
est2fe 0:eae8cffdd121 68 }
est2fe 0:eae8cffdd121 69
est2fe 4:192672304400 70 void *rbuf_get (rbuf_t *r, void *target) // Einen char/Block rausholen mit Readzeiger++
est2fe 0:eae8cffdd121 71 {
est2fe 0:eae8cffdd121 72 void *p_b; // Pointer block
est2fe 0:eae8cffdd121 73 if (r->bufcnt == 0)
est2fe 0:eae8cffdd121 74 {
est2fe 0:eae8cffdd121 75 r->flags = r->flags & ((uint8_t) (~NOT_EMPTY));
est2fe 0:eae8cffdd121 76 return 0;
est2fe 0:eae8cffdd121 77 }
est2fe 0:eae8cffdd121 78 p_b = r->out;
est2fe 0:eae8cffdd121 79 r->out = (void *) (((char *) r->out) + r->blockgroesse );
est2fe 4:192672304400 80 r->bufcnt--; // Ein Objekt weniger im Buffer
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 0:eae8cffdd121 93 memcpy (target, p_b, 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 0:eae8cffdd121 97 if (r->out >= (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 0:eae8cffdd121 100 r->out = r->buf;
est2fe 0:eae8cffdd121 101 }
est2fe 0:eae8cffdd121 102 return p_b; // ?!?
est2fe 0:eae8cffdd121 103 }
est2fe 0:eae8cffdd121 104
est2fe 4:192672304400 105 void *rbuf_put (rbuf_t *r, void *b_p) // Ein Zeichen/Block einstellen
est2fe 0:eae8cffdd121 106 {
est2fe 0:eae8cffdd121 107 void *target;
est2fe 0:eae8cffdd121 108 if (r->bufcnt >= r->buflen)
est2fe 0:eae8cffdd121 109 {
est2fe 0:eae8cffdd121 110 r->fehleranzahl++;
est2fe 0:eae8cffdd121 111 r->flags = r->flags | ((uint8_t) (FEHLER));
est2fe 0:eae8cffdd121 112 return 0; // Wenn Buffer voll dann mit Nullpointer zurueck
est2fe 0:eae8cffdd121 113 }
est2fe 0:eae8cffdd121 114 target = r->in;
est2fe 0:eae8cffdd121 115 memcpy (r->in, b_p, r->blockgroesse);
est2fe 0:eae8cffdd121 116 r->bufcnt++; if (r->bufcnt > r->peak_max) {r->peak_max = r->bufcnt;}
est2fe 0:eae8cffdd121 117 if (r->bufcnt >= r->Schwelle)
est2fe 0:eae8cffdd121 118 {
est2fe 0:eae8cffdd121 119 r->flags = r->flags | ((uint8_t) (FAST_VOLL));
est2fe 0:eae8cffdd121 120 }
est2fe 0:eae8cffdd121 121 else
est2fe 0:eae8cffdd121 122 {
est2fe 0:eae8cffdd121 123 r->flags = r->flags & ((uint8_t) (~FAST_VOLL));
est2fe 0:eae8cffdd121 124 }
est2fe 0:eae8cffdd121 125 r->anzahl++; // Anzahl aller Zeichen/Bloecke aufsummiert
est2fe 0:eae8cffdd121 126 r->flags = r->flags | ((uint8_t) (NOT_EMPTY));
est2fe 0:eae8cffdd121 127
est2fe 0:eae8cffdd121 128 // r->in++; // Falls er das zuerst machen sollte!
est2fe 0:eae8cffdd121 129 r->in = (void *) (((char *) r->in) + r->blockgroesse );
est2fe 0:eae8cffdd121 130 //if (r->in >= r->buf + r->buflen)
est2fe 0:eae8cffdd121 131 if (r->in >= (void *) (((char *)r->buf) + (r->buflen * r->blockgroesse)))
est2fe 0:eae8cffdd121 132 {
est2fe 0:eae8cffdd121 133 // Bei Zeiger > Buffer, Zeiger wieder an Anfang vom Buffer
est2fe 0:eae8cffdd121 134 r->in = r->buf;
est2fe 0:eae8cffdd121 135 }
est2fe 3:c9c7c8e20336 136 return target;
est2fe 0:eae8cffdd121 137 }
est2fe 0:eae8cffdd121 138
est2fe 4:192672304400 139 #endif // von __rbuf_c_