Günstiger ist es, nen Ringpuffer zu verwenden und nicht den ganzen Puffer volatile zu machen.
Der obige ansatz fürt zu sporadischen Fehlern wenn der Interrupt zu ungünstiger Zeit auftritt.
Wenn ein Teil schreibt (Zb die Interrupt Service Routine) und im Hauptprogram gelesen wird, dann funktioniert folgendes. Ist eher ein Vorschlag als ne copy-and-paste-Lösung. Fehlerbahandlunf bei vollem Puffer fehlt noch.
Im Header:
Code:
extern byte rbuf_get();
extern void rbuf_put(byte data);
extern volatile byte rbuf_count;
Im C-File:
Code:
#define RBUF_SIZE 70
static byte rbuf[RBUF_SIZE] __attribute__ ((section (".noinit")));
volatile byte rbuf_count = 0;
byte *rbuf_read = rbuf;
byte *rbuf_write = rbuf;
byte rbuf_get()
{
while (0 == rbuf_count)
;
byte *rd = rbuf_read;
byte data = *(rd++);
if (rd == rbuf+RBUF_SIZE)
rd = rbuf;
rbuf_read = rd;
rbuf_count--;
return data;
}
void rbuf_put(byte data)
{
byte *wrt = rbuf_write;
*(wrt++) = data;
if (wrt == rbuf+RBUF_SIZE)
wrt = rbuf;
rbuf_write = wrt;
rbuf_count++;
}
byte ist bei mit ein unsigned char
Lesezeichen