Hallo,
ich bin gerade am Nachprogrammieren und Anpassen des Codes aus dem
µC.net-Artikel FIFO. Ich habe dabei gerade ein Verständnisproblem
und komme einfach nicht drauf wo mein Denkfehler liegt.
Es geht um folgende Funktion:
1 | uint8_t BufferIn(uint8_t byte)
|
2 | {
|
3 | //if (buffer.write >= BUFFER_SIZE)
|
4 | // buffer.write = 0; // erhöht sicherheit
|
5 |
|
6 | if (buffer.write + 1 == buffer.read || buffer.read == 0 && buffer.write + 1 == BUFFER_SIZE)
|
7 | return FAIL; // voll
|
8 |
|
9 | buffer.data[buffer.write] = byte;
|
10 |
|
11 | buffer.write = buffer.write + 1;
|
12 | if (buffer.write >= BUFFER_SIZE)
|
13 | buffer.write = 0;
|
14 | return SUCCESS;
|
15 |
|
16 | }
|
und hier konkret um die Bedingung:
1 | buffer.read == 0 && buffer.write + 1 == BUFFER_SIZE
|
Mal angenommen BUFFER_SIZE hat den Wert 3 und die Struktur ist wie im
Artikel mit {{},0,0} initialisiert. Jetzt möchte ich das gesammte FIFO
voll schreiben, also alle 3 Felder.
Bricht die Bedingung dann nicht einmal zu früh ab, sodass das letzte
Feld niemals beschrieben werden kann?
1 | FIFO-Einträge buffer.read buffer.write
|
2 | Initialisierung: [][][] 0 0
|
3 | Erster Aufruf: [d0][][] 0 1
|
4 | Zweiter Aufruf: [d0][d1][] 0 2
|
5 | Dritter Aufruf: //FAIL, da buffer.write + 1 == BUFFER_SIZE
|
Kann mir bitte jemand meinen Denkfehler aufzeigen?
lg much