cyclic_buffer.c (Источник)
|
#include <stdint.h>
|
|
|
|
#ifndef XX_BUF_SIZE_BITS
|
|
/* по умолчанию размер буфера 2**5 = 32 */
|
|
#define XX_BUF_SIZE_BITS 5U
|
|
#endif
|
|
|
|
#define XX_BUF_SIZE (1U<<(XX_BUF_SIZE_BITS))
|
|
#define XX_BUF_SIZE_MASK ((XX_BUF_SIZE)-1U)
|
|
|
|
static uint8_t xx_buf[BUF_SIZE] = {0};
|
|
static size_t xx_in_counter = 0U, xx_out_counter = 0U;
|
|
|
|
/******************************************************************************/
|
|
void xx_putchar (uint8_t value)
|
|
{
|
|
xx_buf[xx_in_counter++] = value;
|
|
xx_in_counter &= XX_BUF_SIZE_MASK;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
int xx_getchar (void)
|
|
{
|
|
int retval = -1;
|
|
if (xx_out_counter != xx_in_counter) {
|
|
retval = (int)xx_buf[xx_out_counter++];
|
|
xx_out_counter &= XX_BUF_SIZE_MASK;
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
/******************************************************************************/
|
|
/* если еcть функция getchar */
|
|
void process_xx_buf (void)
|
|
{
|
|
int value;
|
|
while ((value = xx_getchar()) >= 0) {
|
|
....
|
|
}
|
|
}
|
|
|
|
/******************************************************************************/
|
|
/* без использования функции getchar (например, если её вообще нет) */
|
|
void process_xx_buf (void)
|
|
{
|
|
while (xx_out_counter != xx_in_counter) {
|
|
uint8_t value = xx_buf[xx_out_counter++];
|
|
xx_out_counter &= XX_BUF_SIZE_MASK;
|
|
|
|
....
|
|
|
|
}
|
|
}
|