ring buffer

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)