// 링버퍼 초기화
ring_buffer_init();

// 링버퍼에 데이터 넣기 (현재 값은 8비트만 됩니다)
ring_buffer_put(값);

// 링버퍼에서 데이터 얻기
값 = ring_bffer_pop();

----------------------------------------------------------------------------------------------
typedef unsigned char  u08;
typedef unsigned short u16;

#define RING_BUF_SIZE 2048

u08 ring_buf[RING_BUF_SIZE]; // ring buffer
u16 ring_buf_len = 0; // ring buffer length
u16 ring_buf_lp = 0; // load pointer
u16 ring_buf_cp = 0; // consume pointer

void ring_buffer_init(void)
{
    ring_buf_lp = 0;
    ring_buf_cp = 0;
    ring_buf_len = 0;
}

u16 ring_buffer_length(void)
{
    return ring_buf_len;
}

void ring_buffer_push(u08 data)
{
    ring_buf[ring_buf_lp++] = data;
    ring_buf_len++;

    if (ring_buf_len > RING_BUF_SIZE) {
        ring_buf_cp++;
        if (ring_buf_cp == RING_BUF_SIZE) {
            ring_buf_cp = 0;
        }
        ring_buf_len = RING_BUF_SIZE;
    }

    if (ring_buf_lp == RING_BUF_SIZE) {
        ring_buf_lp = 0;
    }
}

u08 ring_buffer_pop(void)
{
    u08 ret = 0;

    if (ring_buf_len > 0) {
        if (ring_buf_cp == RING_BUF_SIZE) {
            ring_buf_cp = 0;
        }
        ret = ring_buf[ring_buf_cp++];
        ring_buf_len--;
    }
    return ret;
}

+ Recent posts