ring buffer
Diff: rbuf.c
- Revision:
- 7:5e960f7b1f79
- Parent:
- 5:ddc33cb62d27
- Child:
- 8:40af324896d9
--- a/rbuf.c Thu Jul 21 07:40:35 2011 +0000 +++ b/rbuf.c Tue Nov 01 09:57:28 2011 +0000 @@ -68,15 +68,16 @@ void *rbuf_get (rbuf_t *r, void *target) // Einen char/Block rausholen mit Readzeiger++ { - void *p_b; // Pointer block + void *p_b = r->out; // Pointer block if (r->bufcnt == 0) { r->flags = r->flags & ((uint8_t) (~NOT_EMPTY)); return 0; } - p_b = r->out; - r->out = (void *) (((char *) r->out) + r->blockgroesse ); + __disable_irq(); // Disable Interrupts r->bufcnt--; // Ein Objekt weniger im Buffer + __enable_irq(); // Enable Interrupts + p_b = (void *) (((char *) p_b) + r->blockgroesse ); if (r->bufcnt >= r->Schwelle) { r->flags = r->flags | ((uint8_t) (FAST_VOLL)); @@ -89,31 +90,34 @@ { r->flags = r->flags & ((uint8_t) (~NOT_EMPTY)); } - memcpy (target, p_b, r->blockgroesse); + memcpy (target, r->out, r->blockgroesse); // (1 - 8) // if (r->out >= r->buf + (r->buflen)) // ?? Hier ist die Zeigerarithmetik noch unklar! - if (r->out >= (void *)(((char *)(r->buf)) + (r->buflen * r->blockgroesse))) // ?? Hier ist die Zeigerarithmetik noch unklar! + if (p_b >= (void *)(((char *)(r->buf)) + (r->buflen * r->blockgroesse))) // ?? Hier ist die Zeigerarithmetik noch unklar! { // wrap around to beginning - r->out = r->buf; + p_b = r->buf; } + r->out = p_b; return p_b; // ?!? } void *rbuf_put (rbuf_t *r, void *b_p) // Ein Zeichen/Block einstellen { - void *target; - if (r->bufcnt >= r->buflen) + void *p_alt = r->in; + void *p_neu = p_alt; + int cnt = r->bufcnt; + if (cnt >= r->buflen) { r->fehleranzahl++; r->flags = r->flags | ((uint8_t) (FEHLER)); return 0; // Wenn Buffer voll dann mit Nullpointer zurueck } - target = r->in; - memcpy (r->in, b_p, r->blockgroesse); - r->bufcnt++; if (r->bufcnt > r->peak_max) {r->peak_max = r->bufcnt;} - if (r->bufcnt >= r->Schwelle) + memcpy (p_alt, b_p, r->blockgroesse); + cnt++; + if ((cnt) > r->peak_max) {r->peak_max = cnt;} + if (cnt >= r->Schwelle) { r->flags = r->flags | ((uint8_t) (FAST_VOLL)); } @@ -125,14 +129,17 @@ r->flags = r->flags | ((uint8_t) (NOT_EMPTY)); // r->in++; // Falls er das zuerst machen sollte! - r->in = (void *) (((char *) r->in) + r->blockgroesse ); - //if (r->in >= r->buf + r->buflen) - if (r->in >= (void *) (((char *)r->buf) + (r->buflen * r->blockgroesse))) + p_neu = (void *) (((char *) p_neu) + r->blockgroesse ); + if (p_neu >= (void *) (((char *)r->buf) + (r->buflen * r->blockgroesse))) { // Bei Zeiger > Buffer, Zeiger wieder an Anfang vom Buffer - r->in = r->buf; + p_neu = r->buf; } - return target; + r->in = p_neu; + __disable_irq(); // Disable Interrupts + r->bufcnt++; // = cnt; + __enable_irq(); // Enable Interrupts + return p_alt; } uint32_t rbuf_getcnt (rbuf_t *buffer)