Перейти к главному содержимому

Listing test

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;
    ....
  }
}