ringbuffer的常规用法_wear ring

ringbuffer的常规用法_wear ring文章目录概述示例引用概述ringbuffer,或者说循环队列,是嵌入式开发中的一个基本模型,常用于命令队列,资源循环分配场合。示例ring_buffer.hringbuffer封装APItestringbuffer.c测试ringbufferapi.//ring_buffer.h#include<stdlib.h>typedefstructs_ring_buffer{ inttail; inthead; intsize; intitem_si

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

文章目录

概述

ring buffer,或者说循环队列,是嵌入式开发中的一个基本模型,常用于命令队列,资源循环分配场合。

示例

ring_buffer.h ring buffer 封装API
testringbuffer.c 测试ring buffer api.

//ring_buffer.h
#include <stdlib.h>

typedef struct s_ring_buffer{
	int tail;
	int head;
	int size;
	int item_size;
	void *buf;
} ring_buffer;

static ring_buffer* ring_buffer_create(int item_size, int size)
{
	size = size + 1;//alloc one more
	void* buf = malloc(item_size * size);
	if (NULL == buf)
		return buf;

	ring_buffer *p_ring_buf = (ring_buffer*)malloc(sizeof(ring_buffer)); 
	if (NULL == p_ring_buf)
		return p_ring_buf;

	p_ring_buf->head = 0; 
	p_ring_buf->tail = 0; 
	p_ring_buf->size = size;
	p_ring_buf->item_size = item_size;
	p_ring_buf->buf = buf;

	return p_ring_buf;
}
static void ring_buffer_free(ring_buffer *p_ring_buf)
{
	if (NULL != p_ring_buf->buf){
		free(p_ring_buf->buf);
		p_ring_buf->buf = NULL;
	
		free(p_ring_buf);
	}
}
static void* ring_buffer_get_tail(ring_buffer *p_ring_buf)
{
	void *item = NULL;
	int tail = p_ring_buf->tail;
	int size = p_ring_buf->size;
	int item_size = p_ring_buf->item_size;
	int n = (tail + 1) % size;
	if (n != p_ring_buf->head){
		item = p_ring_buf->buf + (item_size * tail);
		p_ring_buf->tail = n;
	}
	return item;
}
static void* ring_buffer_get_head(ring_buffer *p_ring_buf)
{
	if (p_ring_buf->head == p_ring_buf->tail)
		return NULL;
	
	int head = p_ring_buf->head;
	int size = p_ring_buf->size;
	int item_size = p_ring_buf->item_size;
	void *item = p_ring_buf->buf + (item_size * head);
	p_ring_buf->head = (head + 1) % size;
	return item;
}
static int ring_buffer_size(ring_buffer *p_ring_buf)
{
	int head = p_ring_buf->head;
	int tail = p_ring_buf->tail;
	int size = p_ring_buf->size;
	return (tail >= head) ? (size - 1 - tail + head) : (size - 1 - head + tail);
}
static int ring_buffer_capacity(ring_buffer *p_ring_buf)
{
	return p_ring_buf->size - 1;
}
//testringbuffer.c
#include "ring_buffer.h"
#include <stdio.h>

void test_get_tail(ring_buffer *ring_buf){
	void *item = ring_buffer_get_tail(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));
	
	item = ring_buffer_get_tail(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

	item = ring_buffer_get_tail(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

}
void test_get_head(ring_buffer *ring_buf){
	void *item = ring_buffer_get_head(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));
	
	item = ring_buffer_get_head(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

	item = ring_buffer_get_head(ring_buf);
	printf("item %p\n", item);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

}

int main(){
	ring_buffer *ring_buf = ring_buffer_create(8, 2);
	printf("buffer size %d, capacity %d\n", ring_buffer_size(ring_buf), ring_buffer_capacity(ring_buf));

	test_get_tail(ring_buf);
	test_get_head(ring_buf);

	return 0;
}

测试结果

$ ./test.exe
buffer size 2, capacity 2
item 0x8000003c0
buffer size 1, capacity 2
item 0x8000003c8
buffer size 0, capacity 2
item 0x0
buffer size 0, capacity 2

item 0x8000003c0
buffer size 1, capacity 2
item 0x8000003c8
buffer size 2, capacity 2
item 0x0
buffer size 2, capacity 2

引用

Circular Queue

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195317.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 蜗牛—ORACLE基础之学习(二)「建议收藏」

    蜗牛—ORACLE基础之学习(二)

    2022年2月7日
    41
  • 大数运算模板

    大数运算模板#include#include#include#includeusingnamespacestd;#defineMAX_DIGIT500//大数运算:加法intAdd(int*a,int*b,int*&result){if(a==NULL||b==NULL||re

    2022年10月7日
    5
  • svn 配置文件_svn环境配置

    svn 配置文件_svn环境配置SVN配置文件说明svnserve是SVN自带的一个轻型服务器,SVN用户端通过使用以svn://或svn+ssh://为前缀的URL来访问svnserve服务器,实现远程访问SVN版本库。svnserve可以通过配置文件来设置用户和口令,以及按路径控制版本库访问权限。本文详细分析了svnserve配置文件格式,并说明如何使用配置文件控制版本库访问权限。一、svnserve配置文件概述svnserve配置文件通常由以下3个文本文件组成:svn服务配置文件,该文件版…

    2025年11月8日
    2
  • oracle函数的创建

    oracle函数的创建函数和存储过程有一定的相似之处,函数用于返回特定的数据,当建立函数时,在函数头部就会包含return字句,而在函数体内必须包含return语句返回的数据,可以使用createfunction来创建函数。案例1输入雇员的姓名,返回雇员的年薪。创建函数:createorreplacefunctionc_hs1(srnamevarchar2)returnnumber …

    2025年9月4日
    6
  • 如何配置python环境变量mac_如何配置python环境变量,如何配置python环境变量mac

    如何配置python环境变量mac_如何配置python环境变量,如何配置python环境变量mac如何配置python环境变量,如何配置python环境变量mac,如何设置Python环境变量大家好,我是Yivies.相信很多python的初学者们在进行一顿下一步下一步的安装之后,在windowscommand命令行输入python的时候会出现这样的情况:可我们希望它是这样子的:其实这是因为你在安装的时候忘记了添加python的环境变量的原因!那接下来我就教大家如何手动设置python的环境…

    2022年6月22日
    48
  • 学习经验谈:Unity3d开发中最佳语言还是C#

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为学unity3d的

    2022年4月14日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号