环形缓存区

应用场景

主要应用于嵌入式平台,uart 收发,RS232RS485 等,因为需要时间去处理数据,为防止数据丢失,把数据存储在缓存区里。

环形缓存区代码

根据韦东山老师的代码更改。

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;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值