应用场景
主要应用于嵌入式平台,uart
收发,RS232
,RS485
等,因为需要时间去处理数据,为防止数据丢失,把数据存储在缓存区里。
环形缓存区代码
根据韦东山老师的代码更改。
ring_buffer.c
#include "ring_buffer.h"
/**
* 初始化新缓冲区
* @handle : ring_buffer句柄
* @addr : 数组地址
* @size : 数组大小
*/
void ring_buffer_init(ring_buffer *handle, ElementType *addr, unsigned int size)
{
handle->addr = addr;
handle->size = size;
handle->r = 0;
handle->w = 0;
}
/**
* 存数据
* @handle : ring_buffer句柄
*/
void ring_buffer_put(ring_buffer *handle, ElementType data)
{
if (handle->r != NEXT_POS(handle->w, handle->size)) /* 下一个写的位置等于r,表示缓存区满了 */
{ /* 存handle->size - 1个数据就认为满了 */
handle->addr[handle->w] = data; /* 在w位置存入数据 */
handle->w = NEXT_POS(handle->w, handle->size); /* 移动w */
}
}
/**
* 取数据
* @handle : ring_buffer句柄
*
* Return : 返回数据
*/
ElementType ring_buffer_get(ring_buffer *handle)
{
ElementType data;
if (handle->r != handle->w) /* 数据不为空 */
{
data = handle->addr[handle->r]; /* 从r位置读取数据 */
handle->r = NEXT_POS(handle->r, handle->size); /* 移动r */
return data;
}
return -1;
}
ring_buffer.h
#ifndef _RING_BUFFER_H_
#define _RING_BUFFER_H_
#define NEXT_POS(x,y) ((x+1) % y)
/* 默认为int类型 */
typedef int ElementType;
typedef struct _ring_buffer
{
ElementType *addr;
unsigned int size;
unsigned int r;
unsigned int w;
} ring_buffer;
void ring_buffer_init(ring_buffer *handle, ElementType *addr, unsigned int size);
void ring_buffer_put(ring_buffer *handle, ElementType data);
ElementType ring_buffer_get(ring_buffer *handle);
#endif /* _RING_BUFFER_H_ */
举例
#include <stdio.h>
#include "ring_buffer.h"
int main(int arc, char **argv)
{
ring_buffer rb;
ElementType array[10] = {0};
int i;
ring_buffer_init(&rb, array, 10);
for (i = 0; i < 10; i++)
{
ring_buffer_put(&rb, i);
}
for (i = 0; i < 12; i++)
{
printf("data = %d\n", ring_buffer_get(&rb));
}
return 0;
}