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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • chinese zodiac signs_icpc铜奖

    chinese zodiac signs_icpc铜奖输入23 14 3输出Impossible2 1 4 33 4 1 24 3 2 1题解 找规律+构造#include<bits/stdc++.h>using namespace std;const int N = 1001;int ch[N][N];int lowbit(int x){ return x & (-x);}int main(){ int n,k; int T; cin>>T; ..

  • 完全删除SQL SERVER[通俗易懂]

    完全删除SQL SERVER[通俗易懂]    我们在安装SQLSERVER的时候,有时会出现问题,而在重新安装的时候,有时候会因为上次安装遗留的东西而导致本次安装失败,所以完全删除SQLSERVER比较重要。完全删除方法如下:      1、控制面板里删除。2、安装目录文件夹删除。3、注册表删除。4、安装windows install clean up 删除所有sql相关的东西。    …

  • 图解一致性哈希算法的基本原理

    图解一致性哈希算法的基本原理一致性哈希的基本原理一致性哈希算法是将每个Node节点映射到同一个圆上。将各Node的key采用hash计算,可得到一个整数数组。将该数组排序后,首尾相连即是一个圆。如下图所示简单来说,一致性Hash算法将整个哈希值空间组织成一个虚拟的圆环,如假设某哈希函数H的值空间为0-2^32-1(即哈希值是一个32位无符号整形),整个哈希环如下:整个空间按顺时针方向组织,圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到2^32-1,也就是说0点左侧..

  • SpringDataJpa:JpaRepository增删改查

    SpringDataJpa:JpaRepository增删改查Jpa查询1.JpaRepository简单查询基本查询也分为两种,一种是springdata默认已经实现,一种是根据查询的方法来自动解析成SQL。 预先生成方法 springdatajpa默认预先生成了一些基本的CURD的方法,例如:增、删、改等等继承JpaRepositorypublicinterfaceUserRepositoryextends…

    2022年10月20日
  • 软引用和弱引用的区别_强引用软引用弱引用虚引用的区别

    软引用和弱引用的区别_强引用软引用弱引用虚引用的区别示例代码:importjava.lang.ref.SoftReference;/***@authorchenjc*@since2020-01-13*/publicclassSoftReferenceTest{/***使用JVM参数-Xmx10m运行程序**@paramargs*@throwsI…

  • Java架构师尼恩_java的面试宝典

    Java架构师尼恩_java的面试宝典加架构师尼恩免费领!专题01:JVM面试题(卷王专供+史上最全+2022面试必备)-V2专题02:Java算法面试题(卷王专供+史上最全+2022面试必备)-V2专题03:Java基础面试题(卷王专供+史上最全+2022面试必备)-V2专题04:架构设计面试题(卷王专供+史上最全+2022面试必备)-V2专题05:Spring面试题__专题06:SpringMVC__专题07:Tomcat面试题(卷王专供+史上最全+2022面试必备)-V2专题0

发表回复

您的电子邮箱地址不会被公开。

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