Ringbuffer:
(ich kenne den CV nicht, also teilweise nur funktionale beschreibung)
Beispiel, nicht optimiert sondern soll das konzept verdeutlichen.
char buffer[32];
char nBytes = 0;
char inPtr = 0;
char outPtr = 0;
Interrupt der den ringbuffer füllt
...
char data = lesedatenVonIrgedwoher();
if(nBytes == sizeof(buffer)/sizeof(char)) //
buffer Voll - Fehler;
else
{
buffer[inPtr++] = data;
nBytes++; // ein byte mehr drin
if(inPtr == sizeof(buffer)/sizeof(char))
inPtr = 0;
if(nBytes == sizeof(buffer)/sizeof(char)) //
handshake_operation - sperre datenquelle
}
...
Auslesen:
...
char retByte;
// Atomare operation -
// darf nicht durch empfangsinterrupt unterbrochen werden.
disable_interrupts();
if(inPtr > 0)
{
retByte = buffer[outPtr++];
nBytes--;
if(outPtr == sizeof(buffer)/sizeof(char))
outPtr = 0;
if(nBytes == sizeof(buffer)/sizeof(char)-1) //
handshake_operation - gebe datenquelle frei
}
else
buffer_empty_error();
restore_previvous_interrupt_state();
...