ring buffer
rbuf.c@4:192672304400, 2011-06-23 (annotated)
- 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?
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 | 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_ |