Это я нагородил еще лет 5 назад для РС. С тех пор и сую везде, где можно не задумываясь. :-)
Спасибо, гляну avrlib.
А буфер у меня не страшный (см. ниже), страшна реализация одновременного доступа к буферу из нескольких фоновых приложений... Но со временем приведу в порядок. В отличии от avrlib у меня используется только ++, а там -деление (точнее остаток).
Код
typedef struct
{ unsigned char *home; // указатель на начало буфера
unsigned char *head; // указатель на голову буфера
unsigned char *tail; // указатель на хвост буфера
unsigned char *end; // указатель на конец буфера
} CIRCULAR_BUFFER;
/* --- put_circle() --------------------------------------------------------------------------------------- **
* Помещает байт dat в кольцевой буфер, при заполнении буфера делает buf->tail = NULL и возвращает -1,
* при уже заполненом буфере затирает байт в голове буфера.
* -------------------------------------------------------------------------------------------------------- */
int put_circle( unsigned char dat, CIRCULAR_BUFFER *buf )
{
int c = 0;
if ( buf->tail == NULL )
{ buf->tail = buf->head; // буфер полон,
if ( ++buf->head == buf->end ) // сдвинем голову
buf->head = buf->home;
}
*buf->tail = dat; // затрем первый байт
if ( ++buf->tail == buf->end )
buf->tail = buf->home;
if ( buf->tail == buf->head ) // буфер заполнен ?
{ buf->tail = NULL; // да
c = -1;
}
return( c );
}
/* --- get_circle() --------------------------------------------------------------------------------------- **
* Возвращает в младшем байте байт из кольцевого буфера, если буфер пуст, возвращает -1
* -------------------------------------------------------------------------------------------------------- */
int get_circle( CIRCULAR_BUFFER *buf )
{
int c = -1;
if ( buf->head != buf->tail ) // буфер пуст ?
{ if ( buf->tail == NULL ) // буфер был полон
buf->tail = buf->head;
c = *buf->head;
if ( ++buf->head == buf->end )
buf->head = buf->home;
}
return( c );
}
/* --- ini_circle() --------------------------------------------------------------------------------------- **
*
* -------------------------------------------------------------------------------------------------------- */
void ini_circle( unsigned char *home, unsigned char *end, CIRCULAR_BUFFER *buf )
{
buf->head = buf->tail = buf->home = home;
buf->end = end;
}
/* --- flush_circle() ------------------------------------------------------------------------------------- **
* Очистка буфера
* -------------------------------------------------------------------------------------------------------- */
void flush_circle( CIRCULAR_BUFFER *buf )
{
buf->tail = buf->head;
}
/* --- status_circle() ------------------------------------------------------------------------------------ **
* Проверка статуса буфера
* Возвращает -1 если буфер полон (нет места)
* 0 если в буфере есть место
* 1 если буфер пуст
* -------------------------------------------------------------------------------------------------------- */
int status_circle( CIRCULAR_BUFFER *buf )
{
if ( buf->tail == NULL ) // буфер заполнен?
return( -1 ); // да
if ( buf->head == buf->tail ) // буфер пуст ?
return( 1 ); // да
return( 0 ); // есть место
}
/* ---------------------------------------------( end of file )-------------------------------------------- */
что-то первый пробел в каждой строчке кода съедается...