Hi,
ich bin hier auf einen megacoolen Fifo gestossen:
Quelle:
http://www.mikrocontroller.net/articles/FIFO#FIFO_mit_C-Pr.C3.A4prozessor
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 | return SUCCESS;
|
19 | }
|
20 |
|
21 | uint8_t BufferOut(uint8_t *pByte)
|
22 | {
|
23 | if (buffer.read == buffer.write)
|
24 | return FAIL;
|
25 | *pByte = buffer.data[buffer.read];
|
26 | buffer.read = (buffer.read+1) & BUFFER_MASK;
|
27 | return SUCCESS;
|
28 | }
|
Ich möchte gerne noch zwei Funktionalitäten dazu haben - Fifo leeren und
Anzahl Elemente im Fifo ausrechnen.
Dazu habe ich mir folgendes ausgedacht:
1 | void BufferClear()
|
2 | {
|
3 | buffer.read = buffer.write = 0;
|
4 | }
|
5 |
|
6 | uint8_t BufferAnzahl()
|
7 | {
|
8 | int16_t hilf;
|
9 | hilf = buffer.write-buffer.read;
|
10 |
|
11 | // keine Werte vorhanden:
|
12 | if (hilf=0) {
|
13 | return (0);
|
14 | }
|
15 |
|
16 | // hilf > 0
|
17 | if (hilf>0) {
|
18 | return (hilf);
|
19 | }
|
20 |
|
21 | if (hilf<0) {
|
22 | return (BUFFER_SIZE-hilf);
|
23 | }
|
24 | }
|
Bei der clear-Funktion braucht man glaub ich nicht weiter diskutieren -
so ist sie auf alle Fälle leer. Aber bei der Ermittlung der Anzahl der
Elemente in dem Fifo bin ich mir unsicher. Ist die Lösung so brauchbar
mit den drei if-Abfragen - oder gibt es eine einfachere Variante? Ich
habe die Hilfsvariable extra als int-Variable genommen, die doppelt so
groß ist, wie die uint8_t-Variable, damit beim Subtrahieren auch ein
negativer Wert funktioniert. Meint ihr, das das so funktioniert, was ich
mir ausgedacht hab?