Forum: Mikrocontroller und Digitale Elektronik RingBuffer / Zeiger Problem


von Ralf (Gast)


Lesenswert?

Hallo,

ich verwende den RingBuffer aus dem Artikel 
http://www.mikrocontroller.net/articles/FIFO#2n-Ringpuffer_-_die_schnellste_L.C3.B6sung
1
#define BUFFER_SIZE 16 // muss 2^n betragen (8, 16, 32, 64 ...)
2
#define BUFFER_MASK (BUFFER_SIZE-1) // Klammern auf keinen Fall vergessen
3
 
4
struct Buffer {
5
  uint8_t data[BUFFER_SIZE];
6
  uint8_t read; // zeigt auf das Feld mit dem ältesten Inhalt
7
  uint8_t write; // zeigt immer auf leeres Feld
8
} buffer = {{}, 0, 0};
9
 
10
uint8_t BufferIn(uint8_t byte)
11
{
12
  uint8_t next = ((buffer.write + 1) & BUFFER_MASK);
13
  if (buffer.read == next)
14
    return FAIL;
15
  buffer.data[buffer.write] = byte;
16
  // buffer.data[buffer.write & BUFFER_MASK] = byte; // absolut Sicher
17
  buffer.write = next;
18
}
19
 
20
uint8_t BufferOut(uint8_t *pByte)
21
{
22
  if (buffer.read == buffer.write)
23
    return FAIL;
24
  *pByte = buffer.data[buffer.read];
25
  buffer.read = (buffer.read+1) & BUFFER_MASK;
26
  return SUCCESS;
27
}

Ich fülle ihn mit daten aus dem UART in der ISR. Das klappt wunderbar.

In der Main loop möchte ich nun zyklisch testen, ob noch etwas im Buffer 
steht und wenn ja, auf eine SD-Karte schreiben.

Und hier habe ich offensichtlich einen Knoten bzgl. des Zeigers in 
meinen Gedanken!
1
if(!BufferOut(*pByte))
2
{
3
 ffwrite(pByte);
4
}

Wenn ich "Das ist ein Test" in den RingBuffer schreibe, erhalte ich mit 
diesem code "DDDDDDDDDDDDDDDD" zurück.

von Karl H. (kbuchegg)


Lesenswert?

Ralf wrote:

>
1
> if(!BufferOut(*pByte))
2
> {
3
>  ffwrite(pByte);
4
> }
5
>
>
> Wenn ich "Das ist ein Test" in den RingBuffer schreibe, erhalte ich mit
> diesem code "DDDDDDDDDDDDDDDD" zurück.
1
int main()
2
{
3
  uint8_t NextCharacter;
4
5
  ....
6
7
  while( 1 ) {
8
    ....
9
10
    if( BufferOut( &NextCharacter ) != FAIL ) {
11
      // mach was mit NextCharacter
12
    }
13
  }
14
}


Und kauf dir ein C-Buch. Parameter Passing und die Rolle die Pointer 
dabei spielen ist absolutes Basiswissen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.